java - 如何为两个不同的 session 配置两个hibernate transactionManager

标签 java spring hibernate spring-transactions transactional

我有一个处理两个不同数据库实例的项目。 对数据库的每次访问都是事务性的,但数据库 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/

相关文章:

java - 从 API 响应中以字符串格式格式化日期和时间

java - 在字符串中返回 "Java"新行?

spring - JWT 身份验证,无需在每个请求中获取用户详细信息

spring - 尝试在 jsp 中显示图像(blob 对象)时出错(Spring 和 Hibernate with Oracle Database)

java - 如何阻止 Maven 在每次项目运行时解包

Java 将输入追加到文件

java - 什么是 C# 等同于 Java 的 ClassName.class.getSimpleName()

java - 如何转换 java.util.Map<String, Object> 中的 google.protobuf.Struct 字段?

spring - 非事务性请求尝试使用 Derby 获得锁

hibernate - JPA (Hibernate) + Tomcat + 两个不同的数据库