我假定你有一组应使用的DAO的
dataSource1和适当的
sessionFactory1,而其他人应该使用不同的
dataSouce2和
sessionFactory2基于
dataSource2。当然,你需要声明第二个
dataSource和其他
bean:只需复制你已有的配置并更改bean id,以免它们冲突。除
<tx:annotation-driven/>以下内容外,所有内容均应镜像:
<bean id="dataSource1" > <!-- ... --></bean><bean id="sessionFactory1" > <property name="dataSource" ref="dataSource1"/> <!-- ... --></bean><bean id="transactionManager1" > <property name="sessionFactory" ref="sessionFactory1"/> <!-- ... --></bean><bean id="dataSource2" > <!-- ... --></bean><bean id="sessionFactory2" > <property name="dataSource" ref="dataSource2"/> <!-- ... --></bean><bean id="transactionManager2" > <property name="sessionFactory" ref="sessionFactory2"/> <!-- ... --></bean><tx:annotation-driven transaction-manager="transactionManager1"/>
真正的问题来了:你现在有两个绑定到不同会话工厂的事务管理器,这些会话工厂又被路由到不同的数据源。但是
@Transactional注释将始终仅使用一个事务管理器-
transactionManager默认情况下命名的事务管理器(请注意,我明确指出
了transactionManager1这一点。这意味着使用第二个数据源的DAO将参与在第一个数据源中启动的事务-这显然不是预期的。
有一些解决方法,例如在
@Transactional批注中显式定义事务管理器名称(从未尝试过使用)或使用
TransactionTemplate,但是如你所见,应该仔细考虑问题。
至于自动装配-如果你按名称自动装配,请为你的字段命名与会话工厂或数据源ID相同,它应该起作用-但实际上这是你的最小问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)