如何为两个不同的会话配置两个hibernate transactionManager

时间:2014-06-18 04:18:43

标签: java spring hibernate spring-transactions transactional

我有一个处理两个不同数据库实例的项目。 每次访问数据库都是事务性的,但是database1上的事务不需要链接到database2上的事务。

我正在使用Hibernate和spring-tx 4.0.3版本,Spring Ioc4和hibernate4。

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

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

但是这样做,我得到一个UniqueBeanExceptionTransactionAspectSupport.determineTransactionManager尝试只找到一个实现PlatformTransactionManager接口的类的实例。

我已经看到我可以使我的java配置类实现TransactionManagementConfigurer,这样我就可以专门告诉使用哪个事务管理器bean,我希望实现一个可以委派的ProxyTransactionManager根据需要进行当前调用的数据库,每个适当的事务管理器。

问题在于实现这样的ProxyPlatformTransactionManager方法,如何知道正在访问哪个数据库,或者正在访问哪个SessionFactory?否则我不知道使用哪个PlatformTransactionManager

有没有人遇到过这类问题?

谢谢,

梅尔

1 个答案:

答案 0 :(得分: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")

仅供参考:您也可以使用限定符从代码中访问多个sessionFactories

@Autowired
@Qualifier(value="sessionFactory2")
private SessionFactory sessionFactory;