Criar Multi-Tenancy por schema com hibernate 4

3 respostas
H

Galera estou tentando desenvolver uma aplicacao web com vraptor + hibernate e agora estou tentando implementar uma solucao para o multi schema…
precisava de um exemplo de alguem que ja implementou desde ja agradeco…Vlw

3 Respostas

M

precisava de um exemplo de alguem que ja implementou desde ja agradeco…Vlw

Também estou precisando desse exemplo. Nem a documentação do hibernate ajuda muito…

H

Pesquisei um pouco aki e consegui implementar uma gambiarra com hibernate 4 vou postar o codigo depois pra vcs me ajudarem a melhorar!!!

H
import org.hibernate.MultiTenancyStrategy;
import org.hibernate.SessionFactory;
import org.hibernate.cache.internal.NoCachingRegionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.hibernate.service.jdbc.connections.spi.MultiTenantConnectionProvider;

import com.ServicoMultiTenant;

public class FabricaConexoes {
	
	private ServiceRegistry serviceRegistry;
	private SessionFactory sessionFactory;
	private ServicoMultiTenant multiTenant;
	
	public FabricaConexoes() {
		
		Configuration cfg = new Configuration();
    	cfg.setProperty( Environment.MULTI_TENANT, MultiTenancyStrategy.SCHEMA.toString() );
		cfg.setProperty( Environment.CACHE_REGION_FACTORY, NoCachingRegionFactory.class.getName() );
		cfg.configure();
		// Até aki eu configuro o hibernate para usar multitenant
        
        multiTenant = new ServicoMultiTenant(cfg);
        //aki eu passo a configuracao para uma classe de servico que criara conexoes
        //multitenant por Schema

        
        serviceRegistry = new ServiceRegistryBuilder().applySettings(cfg.getProperties())
        		.addService(MultiTenantConnectionProvider.class, multiTenant).buildServiceRegistry();
        //Metodo addService(); eu passo como parameto a interface multitenant e minha classe que 
        //implementa multitenant
        this.sessionFactory = cfg.buildSessionFactory(serviceRegistry);
	}

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	
	
	

}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.jdbc.connections.spi.MultiTenantConnectionProvider;

public class ServicoMultiTenant implements MultiTenantConnectionProvider {
	
	Configuration cfg;
	
	public ServicoMultiTenant(Configuration cfg) {
		this.cfg = cfg;
	}
	
	@Override
	public boolean isUnwrappableAs(Class arg0) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public <T> T unwrap(Class<T> arg0) {
		// TODO Auto-generated method stub
		return null;
	}
	
	//metodo que configura uma conexao default para o hibernate
	@Override
	public Connection getAnyConnection() throws SQLException {
		String url = cfg.getProperty("connection.url");
		String usuario = cfg.getProperty("connection.username");
		String senha = cfg.getProperty("connection.password");
		return DriverManager.getConnection(url, usuario	, senha);
	}
	
	//metodo que configura conexao para o schema especifico
	@Override
	public Connection getConnection(String tenant) throws SQLException {
		
		String url = congfiguraUrl(cfg.getProperty("connection.url"),tenant);
		String usuario = cfg.getProperty("connection.username");
		String senha = cfg.getProperty("connection.password");
		return DriverManager.getConnection(url, usuario	, senha);
	}

	@Override
	public void releaseAnyConnection(Connection arg0) throws SQLException {
		
		
	}

	@Override
	public void releaseConnection(String arg0, Connection arg1)
			throws SQLException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean supportsAggressiveRelease() {
		// TODO Auto-generated method stub
		return false;
	}
	
	private String congfiguraUrl (String url , String schema) {
		StringBuilder novaUrl = new StringBuilder(url);
		
		char[] x = novaUrl.toString().toCharArray();
		
		int subS = 0;
		
		for (int i = x.length - 1; i >= 0; i--) {
			if(x[i] == '/') {
				break;
			}
			subS = i;
		}
		
		for (int i = novaUrl.length()-1; i>= subS; i--) {
			novaUrl.deleteCharAt(i);
		}
		
		return novaUrl.append(schema).toString();
	}

}

Ta ai minha gambiarra para multitenant

Criado 6 de março de 2013
Ultima resposta 7 de mar. de 2013
Respostas 3
Participantes 2