我的所有DAO中都有@Transactional注释,但我只能定义一个只占用一个SessionFactory的TransactionManager。我每个客户有一个SessionFactory,每个客户一个DataSource,显然我需要为每个客户更改TransactionManager。但是,当我只能为一个TransactionManager定义一个Spring bean名称时,如何为客户获取正确的事务管理器?
答案 0 :(得分:8)
Spring 3支持多个事务管理器,同时保留声明性@Transactional分隔
这不是你想要的吗?
答案 1 :(得分:2)
这是Spring的声明式事务管理不再方便的示例,您需要切换到programmatic management以获得所需的灵活性。这将允许您将事务管理器的映射注入DAO层,并相应地选择正确的映射,使用TransactionTemplate
使事情变得更容易。
或者,如果您在支持JTA的容器内运行,则可以使用Spring的JtaTransactionManager
。这会将事务管理委托给app服务器,同时保留Spring API语义。它还意味着任意数量的DataSource和SessionFactories可以在一个事务管理器下参与。但是,这意味着您的DataSource需要由appserver完全管理,这可能不适合您。
答案 2 :(得分:1)
您可以创建一个PlatformTransactionManager
,用于将调用委派给当前客户的客户特定事务管理器。例如,当前的客户可以存储为ThreadLocal
变量。