HibernateUtil X ApplicationContext e Spring

1 resposta
kweles

Olá Pessoal!

Qdo trabalho sem o spring utilizo a classe HibernateUtil, onde posso controlar a sessionFactory e td mais. Contudo qdo estou no spring
ele injeta a sessionFactory e acabo não tendo controle dela. Não que isso seja ruim, mas para o problema que preciso resolver "conectar multiplos databases"
eu precisaria conseguir gerenciar a session factory. É possível fazer isto? Alguém teria algum exemplo!

No HibernateUtil, tenho dois arquivos cfg, um apontando para o banco produção e outro para o teste. Daí na conexão o usuário escolhe qual banco utilizar pelo cfg:

private static void getConexao(String cfgEscolhido){
		
		try {
			hibernateCfg = cfgEscolhido
	
					
			annotationConfiguration = new AnnotationConfiguration();
			annotationConfiguration.addAnnotatedClass(Adm_Usuario.class);
			annotationConfiguration.addAnnotatedClass(Item.class);						
	
			sessionFactory = annotationConfiguration.configure(hibernateCfg).buildSessionFactory();

			
		} catch (Throwable ex) {
			throw new ExceptionInInitializerError(ex);
		}
		
	}

Como eu posso fazer algo parecido com isto no spring, sendo que tudo está no applicationContext, nos dataSources???

Obrigado!

1 Resposta

kweles

Olá Pessoal!

Tenho lido algo à respeito de AbstractRoutingDataSource, contudo parece estar faltando algo para funcionar efetivamente, utilizei como base os artigos abaixo:

:applicationContext:

<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>${jdbc.driverClassName}</value>
		</property>
		<property name="url">
			<value>${jdbc.url}</value>
		</property>
		<property name="username">
			<value>${jdbc.username}</value>
		</property>
		<property name="password">
			<value>${jdbc.password}</value>
		</property>
	</bean>

	<bean id="dataSource2"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>${jdbc.driverClassName}</value>
		</property>
		<property name="url">
			<value>${jdbc.url2}</value>
		</property>
		<property name="username">
			<value>${jdbc.username2}</value>
		</property>
		<property name="password">
			<value>${jdbc.password2}</value>
		</property>
	</bean>

	<bean id="routingDS" class="br.com.cpb.gtf.infra.RoutingDataSource">
	   <property name="targetDataSources">
	      <map key-type="java.lang.String">
	         <entry key="br.com.cpb.gtf.infra.SchemaConstants.TESTE" value-ref="dataSource2"/>
	         <entry key="br.com.cpb.gtf.infra.SchemaConstants.PRODUCAO" value-ref="dataSource"/>	         
	      </map>
	   </property>
	   <property name="defaultTargetDataSource" ref="dataSource2"/>
	</bean>

No caso acima estou utilizando dois dataSources. Um para o banco producao e outro para o banco teste. há tbm o arquivo de configuração o .properties onde especifico os dados de acesso ao banco.

Depois tenho a classe: Routing:

package br.com.cpb.gtf.infra;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class RoutingDataSource extends AbstractRoutingDataSource {

	@Override
    protected Object determineCurrentLookupKey()
    {
        return Globals.getSchema();
    }

}
package br.com.cpb.gtf.infra;

public class Globals {
	private static final ThreadLocal<String> schemaHolder = new ThreadLocal<String>();

	public static void setSchema(String schema) {
		schemaHolder.set(schema);
	}

	public static String getSchema() {
		return schemaHolder.get();
	}

	public static void clearCustomerType() {
		schemaHolder.remove();
	}
}
package br.com.cpb.gtf.infra;

public class SchemaConstants {

	public static final String PRODUCAO = "dataSource";
	public static final String TESTE = "dataSource2";
	
}

e na chamada do serviço eu tento alterar o dataSource, mas não funciona:

@RemotingInclude
	@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
	public Adm_Usuario logar(Adm_Usuario user)  {
		
		Globals.setSchema(SchemaConstants.TESTE);
				
		Adm_UsuarioDao dao = new Adm_UsuarioDao(sessionFactory);
		Adm_Usuario admUsuario 	= dao.logar(user);		
		
		setLoggedUserOnSession(admUsuario);	
		return admUsuario;
		
	}

Alguém já fez algo parecido que pudesse dar uma dica?

Obrigado!

Criado 11 de dezembro de 2011
Ultima resposta 12 de dez. de 2011
Respostas 1
Participantes 1