【问题标题】:@EnableJpaRepositories.enableDefaultTransactions = false not working@EnableJpaRepositories.enableDefaultTransactions = false 不起作用
【发布时间】:2017-01-02 07:03:12
【问题描述】:

JavaDoc 读取

配置是否为 Spring Data JPA 存储库启用默认事务。默认为真。如果禁用,则必须在配置事务的外观后面使用存储库(例如,使用 Spring 的注释驱动事务工具),或者必须使用存储库方法来划分事务。

我调试到框架中,如果不存在,它只会创建一个事务,即使 enableDefaultTransactions = false。

据我所知,Spring Data JPA Repositories 预先配置了 @Transactional(readOnly=true)(请参阅 SimpleJpaRepository),这导致没有人注意到程序员何时忘记正确注释他的服务或工作@Transactional 因为 Spring Data JPA 为每个被调用的存储库方法创建一个事务。

我想禁用它。第一次尝试是在我的存储库超级界面上放置一个@Transactional(MANDATORY)。那行不通。

然后我注意到@EnableJpaRepositories 注释中的“enableDefaultTransactions”。我将其设置为 false,但没有任何改变。 JavaDoc 让我相信它会做我想做的事:删除默认事务支持并在使用存储库时抛出异常,而无需处于事务上下文中。

我错了吗?这是一个错误吗? enableDefaultTransactions 是否还有其他用途?

使用spring data jpa 1.9.0.RELEASE.

【问题讨论】:

    标签: spring-data spring-data-jpa


    【解决方案1】:

    enableDataTransactions=false 的目的是从实现中删除默认的事务管理(我猜来自 SimpleJpaRepository)。它的行为就像没有指定 @Transactional 一样。然后就可以在服务层控制事务了。

    https://jira.spring.io/browse/DATAJPA-685

    但是,无论 enableDataTransactions 参数如何,如果您在存储库接口中添加自己的@Transactional 注解,它将被正确应用。

    但是,但是!如果在类型级别上指定 @Transactional,Spring 框架本身(与数据和 JPA 项目无关)将仅将其应用于以该类型声明的方法,而不应用于继承的方法。我认为这种行为是正确的!只有重写方法,你才能改变它的规范和实现。

    @Transactional(propagation=Propagation.MANDATORY)
    public interface MyRepository extends CrudRepository<Something, Long> {
        @Override
        public Something findOne(Long id);
    }
    

    在此示例中,MANDATORY 传播将适用于 findOne,但不适用于 findAll。

    注意:尽管我发现这种行为是正确的,但我仍然不喜欢没有标准的方法来全局配置 MANDATORY 传播。在我看来,它甚至应该是默认的。

    在以前的版本中存在错误。我使用 Spring 4.2.2 和 Sprint Data 1.11.0 来测试它。

    错误报告:

    【讨论】:

    • 感谢您的意见,德拉甘。同时,我将 @Transactional(propagation = Propagation.MANDATORY) 添加到我的所有存储库中,因为 enableDataTransactions=false 没有在我的测试中删除事务支持。我发现继承的方法在实际项目中使用得很少,如果有的话,所以我们主要依赖于我们自己的存储库方法,这些方法通过强制注释来处理。
    猜你喜欢
    • 2013-09-20
    • 2021-12-30
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2020-04-28
    相关资源
    最近更新 更多