我有一个处理两个不同数据库实例的项目。 对数据库的每次访问都是事务性的,但数据库 1 上的事务不需要链接到数据库 2 上的事务。
我正在使用 Hibernate 和 spring-tx 4.0.3 Release、spring Ioc4 和 hibernate4。
我在 DAO 服务中使用 @Transactional
注释。
因此,我配置了两个数据源 bean、两个 sessionFactory bean 和两个 HibernateTransactionManager bean。
但是这样做时,我得到了一个UniqueBeanException
,因为TransactionAspectSupport.defineTransactionManager
尝试仅查找一个实现PlatformTransactionManager
接口(interface)的类的实例。
我已经看到我可以让我的java配置类实现TransactionManagementConfigurer
,这样我就可以具体告诉要使用哪个事务管理器bean,并且我希望实现一个ProxyTransactionManager
谁可以根据当前需要进行的调用委托(delegate)给每个适当的事务管理器。
问题是实现这样的ProxyPlatformTransactionManager
方法,我如何知道正在访问哪个数据库,或者正在访问哪个SessionFactory
?否则我不知道要使用哪个 PlatformTransactionManager
。
有人遇到过此类问题吗?
谢谢
梅尔
最佳答案
在您的应用程序上下文中,您需要定义 2 个 transactionalManager,如下所示
<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;
关于java - 如何为两个不同的 session 配置两个hibernate transactionManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24277001/