Java 如何为两个不同的会话配置两个hibernate transactionManager
我有一个处理两个不同数据库实例的项目。 对数据库的每次访问都是事务性的,但database1上的事务不需要链接到database2上的事务 我使用的是Hibernate和SpringTX4.0.3版本,SpringIOC4和hibernate4 我在DAO服务中使用Java 如何为两个不同的会话配置两个hibernate transactionManager,java,spring,hibernate,spring-transactions,transactional,Java,Spring,Hibernate,Spring Transactions,Transactional,我有一个处理两个不同数据库实例的项目。 对数据库的每次访问都是事务性的,但database1上的事务不需要链接到database2上的事务 我使用的是Hibernate和SpringTX4.0.3版本,SpringIOC4和hibernate4 我在DAO服务中使用@Transactional注释 因此,我配置了两个数据源bean、两个sessionFactory bean和两个HibernateTransactionManager bean 但是这样做,我得到了一个UniqueBeanExce
@Transactional
注释
因此,我配置了两个数据源bean、两个sessionFactory bean和两个HibernateTransactionManager bean
但是这样做,我得到了一个UniqueBeanException
作为TransactionSpectSupport。DeterminateTransactionManager
尝试只查找实现PlatformTransactionManager
接口的类的一个实例
我已经看到,我可以让我的java配置类实现TransactionManagementConfigurer
,这样我就可以明确地知道要使用哪个事务管理器bean,我希望实现一个ProxyTransactionManager
,根据当前调用需要哪个数据库,它可以委托给每个适当的事务管理器
问题在于实现这样的ProxyPlatformTransactionManager
方法,我如何知道正在访问哪个数据库,或者正在访问哪个SessionFactory
?否则,我不知道使用哪个平台TransactionManager
有人面临过这样的问题吗
谢谢
Mel在应用程序上下文中,您需要定义两个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>
仅供参考:您还可以使用限定符从代码中访问多个SessionFactory
@Autowired
@Qualifier(value="sessionFactory2")
private SessionFactory sessionFactory;
只需在注释中指定它应用于哪个tx管理器,spring就会为您完成这项工作。不需要额外的类。谢谢Deinum,我确实考虑过:)但不幸的是,我的一些Hibernate对象是在一些jar库中定义的。因此,如果我使用这种方法,我需要破解所有这些类,以便输入适当的tx管理器。除非有办法将默认的tx管理器设置为bean之一?
@Autowired
@Qualifier(value="sessionFactory2")
private SessionFactory sessionFactory;