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

标签 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 value 被忽略并使用database1TransactionManager 代替。

查看 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#tx-multiple-tx-mgrs-with-attransactional

是否可以将查询限制为使用 @Transactional指定的 transactionManager 而不是任何其他的,即使它抛出异常。即使@Transactional将拼写错误的名称指定为 transactionManager。

数据库.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 配置错误,但 Spring 交互仍然有效。

最佳答案

谢谢大家。我决定我并不真正需要任何 Spring 事务同步。 我将其添加到database.xml:

属性名称=“transactionSynchronization”值=“2”

现在,如果 @Transactional 值不正确,则会引发异常。

关于java - Spring/Hibernate项目@Transactional注释值不被使用并自动替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33082803/

相关文章:

java - 在 Excel 文件中创建 Excel 图表

java - 相同的条件逻辑为 Java 中的 AtomicBoolean 生成两个截然不同的字节码。为什么?

java - Spring Boot 应用程序不可执行

java - 使用 EJB 的 Spring Security

java - 如何更新@OneToMany 集合中的现有条目?

java - token “Invalid Character” 出现语法错误,删除此 token

java - JPA+Hibernate+Mysql的查询语言问题

java - MVC 中 Hibernate 延迟属性初始化的最佳实践?

java - 使用 Hibernate ConstraintViolationException

java - 模拟类的内部方法