Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为两个不同的会话配置两个hibernate transactionManager_Java_Spring_Hibernate_Spring Transactions_Transactional - Fatal编程技术网

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

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

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

我使用的是Hibernate和SpringTX4.0.3版本,SpringIOC4和hibernate4

我在DAO服务中使用
@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;