多个SessionFactories,多个DataSource和Hibernate TransactionManager只能使用一个Sessionfactory

时间:2010-12-10 10:56:02

标签: java hibernate spring transactions

我的所有DAO中都有@Transactional注释,但我只能定义一个只占用一个SessionFactory的TransactionManager。我每个客户有一个SessionFactory,每个客户一个DataSource,显然我需要为每个客户更改TransactionManager。但是,当我只能为一个TransactionManager定义一个Spring bean名称时,如何为客户获取正确的事务管理器?

3 个答案:

答案 0 :(得分:8)

Spring 3支持多个事务管理器,同时保留声明性@Transactional分隔

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-multiple-tx-mgrs-with-attransactional

这不是你想要的吗?

答案 1 :(得分:2)

这是Spring的声明式事务管理不再方便的示例,您需要切换到programmatic management以获得所需的灵活性。这将允许您将事务管理器的映射注入DAO层,并相应地选择正确的映射,使用TransactionTemplate使事情变得更容易。

或者,如果您在支持JTA的容器内运行,则可以使用Spring的JtaTransactionManager。这会将事务管理委托给app服务器,同时保留Spring API语义。它还意味着任意数量的DataSource和SessionFactories可以在一个事务管理器下参与。但是,这意味着您的DataSource需要由appserver完全管理,这可能不适合您。

答案 2 :(得分:1)

您可以创建一个PlatformTransactionManager,用于将调用委派给当前客户的客户特定事务管理器。例如,当前的客户可以存储为ThreadLocal变量。