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
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…
Pesquisei um pouco aki e consegui implementar uma gambiarra com hibernate 4 vou postar o codigo depois pra vcs me ajudarem a melhorar!!!
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;
}
}
[code]
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();
}
}[/code]
Ta ai minha gambiarra para multitenant