Spring / Hibernate项目@Transactional注释值未被使用并自动替换

时间:2015-10-12 13:45:55

标签: java spring hibernate spring-mvc transactions

我在项目中遇到spring 4 / hibernate 4和xml数据库配置问题。 数据库分为2. @Transactional指定的错误的transactionManager,但hibernate连接到正确的数据库而不会抛出任何异常。 Dao方法用@Transactional注释如下:

@Repository
public class SampleDao {

    @Transactional("database2TransactionManager")
    public SamplePojo getSamplePojo(String smth) {
    database1SessionFactory.getCurrentSession().createCriteria(SamplePojo.class)
        //some code
    }
}

假设SampleDao.getSamplePojo()实际上从使用database1TransactionManager定义的database1获取数据。在这种情况下,将忽略@Transactional值,而是使用database1TransactionManager。

请参阅 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#tx-multiple-tx-mgrs-with-attransactional

是否可以限制使用@Transactional指定的事务管理器而不是任何其他事务查询,即使它引发异常也是如此。即使@Transactional指定带有拼写错误的名称为transactionManager。

database.xml:

<tx:annotation-driven transaction-manager="database1TransactionManager"/>
<tx:annotation-driven transaction-manager="database2TransactionManager"/>

<!--  Database related configuration  -->
<bean id="database1DataSource" destroy-method="close">
//properties
</bean>

<!--  Database related configuration  -->
<bean id="database2DataSource" destroy-method="close">
//properties
</bean>

<bean id="database1SessionFactory" name="database1SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="database1DataSource">
//properties
</bean>

<bean id="database2SessionFactory" name="database2SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="database2DataSource">
//properties
</bean>

<bean id="database1TransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" depends-on="database1SessionFactory">
    <property name="sessionFactory" ref="database1SessionFactory"/>
    <qualifier value="database1TransactionManager"/>
</bean>

<bean id="database2TransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" depends-on="database2SessionFactory">
    <property name="sessionFactory" ref="database2SessionFactory"/>
    <qualifier value="database2TransactionManager"/>
</bean>

我使用单独的数据库,因此重要的是显示这些错误并且我知道它们而不是Spring 4自动进行一些替换。 我做了一些调试,这就是我发现的。有一个标记有@Transactional的DAO方法,为其指定了database2TransactionManager。但是,无论如何都不能在此方法中使用database2TransactionManager,因为它是通过database1SessionFactory访问的。这些是两个独立的数据库,具有单独的用户等。实际上,Spring不使用database2TransactionManager,它将被database1SessionFactory中的值替换。所以它出现了错误的@Transactional配置,它仍然适用于春季互动。

1 个答案:

答案 0 :(得分:0)

感谢大家。我决定不需要任何Spring Transaction Synchronization。 我将其添加到database.xml:

property name =“transactionSynchronization”value =“2”

现在,如果@Transactional值不正确,则抛出异常。