我有一个处理两个不同数据库实例的项目。 每次访问数据库都是事务性的,但是database1上的事务不需要链接到database2上的事务。
我正在使用Hibernate和spring-tx 4.0.3版本,Spring Ioc4和hibernate4。
我在DAO服务中使用@Transactional
注释。
所以我配置了两个数据源bean,两个sessionFactory bean和两个HibernateTransactionManager bean。
但是这样做,我得到一个UniqueBeanException
,TransactionAspectSupport.determineTransactionManager
尝试只找到一个实现PlatformTransactionManager
接口的类的实例。
我已经看到我可以使我的java配置类实现TransactionManagementConfigurer
,这样我就可以专门告诉使用哪个事务管理器bean,我希望实现一个可以委派的ProxyTransactionManager
根据需要进行当前调用的数据库,每个适当的事务管理器。
问题在于实现这样的ProxyPlatformTransactionManager
方法,如何知道正在访问哪个数据库,或者正在访问哪个SessionFactory
?否则我不知道使用哪个PlatformTransactionManager
。
有没有人遇到过这类问题?
谢谢,
梅尔
答案 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;