[SPRING] Multiplos sessions factories

Bom dia, pessoal.

Estou em um primeiro projeto utilizando Spring e já fazendo algo diferente…rsrs.
Estou precisando definir para beans diferentes sessionFactory.
Estes beans extendem HibernateDaoSuport.

applicationContext.xml

[code]<?xml version=“1.0” encoding=“UTF-8”?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
default-autowire=“byName” >

&lt;context:component-scan base-package="br.edu.mba.artigo.bus.bo" /&gt;

&lt;!-- ************************************ Beans de fabrica de sessão ****************************** --&gt;

&lt;bean id="sessionFactoryRelacional"  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&gt;
	&lt;property name="configLocation"
		value="classpath:hibernate_usuarios.cfg.xml"&gt;
	&lt;/property&gt;
&lt;/bean&gt;

&lt;bean id="sessionFactoryXML" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&gt;
	&lt;property name="configLocation"
		value="classpath:hibernate_artigos.cfg.xml"&gt;
	&lt;/property&gt;
&lt;/bean&gt;

&lt;!-- *********************************** Beans de negócio **************************************** --&gt;

&lt;bean id="artigoBO" class="br.edu.mba.artigo.bus.bo.ArtigoBO" &gt;
	&lt;property name="sessionFactory"&gt;
		&lt;ref  local="sessionFactoryXML"/&gt;
	&lt;/property&gt;
&lt;/bean&gt;

&lt;bean id="usuarioBO" class="br.edu.mba.artigo.bus.bo.UsuarioBO" &gt;
	&lt;property name="sessionFactory"&gt;
		&lt;ref  local="sessionFactoryRelacional"/&gt;
	&lt;/property&gt;
&lt;/bean&gt;

&lt;!-- *********************************** Controle de Transação ************************************* --&gt;

&lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" &gt;
&lt;/bean&gt;

&lt;tx:annotation-driven /&gt;

</beans>[/code]

Obs.: UsuarioBO e ArtigoBO extendem HibernateDaoSupport.

Exceção lançada quando executo o seguinte código:

public final static ApplicationContext APPLICATION_CONTEXT = new FileSystemXmlApplicationContext(BusinessService.class.getResource("/applicationContext.xml").getFile());

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'artigoBO' defined in file [H:\projetos\castor\br.edu.mba.artigo\bin\applicationContext.xml]: Cannot resolve reference to bean 'sessionFactoryXML' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactoryXML' defined in file [H:\projetos\castor\br.edu.mba.artigo\bin\applicationContext.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.config.internalTransactionAdvisor': Cannot create inner bean '(inner bean)' of type [org.springframework.transaction.interceptor.TransactionInterceptor] while setting bean property 'transactionInterceptor'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Cannot resolve reference to bean 'transactionManager' while setting bean property 'transactionManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager' defined in file [H:\projetos\castor\br.edu.mba.artigo\bin\applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sessionFactory' is required at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1244) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1008) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:470) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409) at java.security.AccessController.doPrivileged(Native Method) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:220) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381) at org.springframework.context.support.FileSystemXmlApplicationContext.&lt;init&gt;(FileSystemXmlApplicationContext.java:140) at org.springframework.context.support.FileSystemXmlApplicationContext.&lt;init&gt;(FileSystemXmlApplicationContext.java:84) at br.edu.mba.artigo.bus.BusinessService.&lt;clinit&gt;(BusinessService.java:12)

Agradeço qualquer ajuda.

Opa,

sua configuração quanto os dois SessionFactories está certa. O erro está na linha abaixo:

A propriedade sessionFactory do TransactionManager não foi setada. Você vai precisar associar um transaction manager para cada SessionFactory. Tente assim:

&lt;bean id="transactionManagerA" class="org.springframework.orm.hibernate3.HibernateTransactionManager" &gt; &lt;property name="sessionFactory"&gt; &lt;ref local="sessionFactoryXML"/&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="transactionManagerB" class="org.springframework.orm.hibernate3.HibernateTransactionManager" &gt; &lt;property name="sessionFactory"&gt; &lt;ref local="sessionFactoryRelacional"/&gt; &lt;/property&gt; &lt;/bean&gt;

ps. Id dos Beans foi alterado, conforme a dica do pmlm.

[quote=Franklin]

&lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" &gt; &lt;property name="sessionFactory"&gt; &lt;ref local="sessionFactoryXML"/&gt; &lt;/property&gt; &lt;/bean&gt; &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" &gt; &lt;property name="sessionFactory"&gt; &lt;ref local="sessionFactoryRelacional"/&gt; &lt;/property&gt; &lt;/bean&gt; [/quote]

Os beans devem ter id diferente.

Boa tarde Franklin.

Não recebi notificação da sua resposta e acabei por desistir de fazer isso.
Mas, ainda estou curioso se funciona ou não…

Definindo um transaction manager por session factory será possíve ter uma transação para duas operações nestes dois bancos de dados?
Ou seja, se a segunda operação falhar vou conseguir fazer rollback na primeira?

Obrigado pela ajuda.