2014-06-18 58 views
0

我有一个处理两个不同数据库实例的项目。 对数据库的每次访问都是事务性的,但database1上的事务不需要链接到database2上的事务。如何为两个不同的会话配置两个hibernate transactionManager

我使用Hibernate和spring-tx 4.0.3 Release,spring Ioc4和hibernate4。

我在我的DAO服务中使用@Transactional注释。

所以我配置了两个数据源bean,两个sessionFactory bean和两个HibernateTransactionManager bean。

但是这样做,我得到UniqueBeanException,因为TransactionAspectSupport.determineTransactionManager试图找到只实现PlatformTransactionManager接口的类的一个实例。

我已经看到了,我可以让我的Java配置类实现TransactionManagementConfigurer,这样我可以明确告诉要使用的事务管理器bean,而我希望能实现一个ProxyTransactionManager谁可以委托给各相应的事务管理器根据在当前的呼叫需要在哪个数据库上进行。

问题是执行这样的ProxyPlatformTransactionManager方法,我怎么知道哪个数据库被访问,或哪个SessionFactory被访问?否则我一个不知道使用哪个PlatformTransactionManager

有没有人遇到过这种类型的问题呢?

感谢,

梅尔

+0

只需在['@ Transactional'(http://docs.spring.io/spring/指定访问多个sessionFactories docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html#value--)注释,它适用于tx管理器,spring会为你做。无需额外的课程。 –

+0

谢谢Deinum,我的确想过:)但不幸的是,我的一些Hibernate对象是在一些jar库中定义的。所以如果我使用这种方法,我需要破解所有这些类以输入适当的tx管理器。除非也许有办法将默认tx管理器设置为其中一个bean? – Melanie

回答

1

在你的应用环境,你需要定义2个transactionalManagers如下

<bean id="txMngr1" class="org.springframework.orm.hibernate5.HibernateTransactionManager" 
      p:sessionFactory-ref="sessionFactory1"> 
    <qualifier value="txMngr1"/> 
</bean> 
<bean id="txMngr2" class="org.springframework.orm.hibernate5.HibernateTransactionManager" 
      p:sessionFactory-ref="sessionFactory2"> 
    <qualifier value="txMngr2"/> 
</bean> 

然后使用事务预选赛与你的DAO /服务。

@Transactional("txMngr2") 

FYI:您可以从代码中使用预选赛以及

@Autowired 
@Qualifier(value="sessionFactory2") 
private SessionFactory sessionFactory; 
相关问题