@ EnableJpaRepositories.enableDefaultTransactions = false无法正常工作

时间:2016-08-25 18:16:22

标签: spring-data spring-data-jpa

JavaDoc读取

  

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

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

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

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

然后我注意到@EnableJpaRepositories注释中的“enableDefaultTransactions”。我把它设置为假,但没有改变。 JavaDoc让我相信它会完全符合我的要求:删除默认事务支持并在使用存储库时抛出异常,而不是在事务上下文中。

我错了吗?这是一个错误吗? enableDefaultTransactions是否有其他方式?

使用spring data jpa 1.9.0.RELEASE。

1 个答案:

答案 0 :(得分:0)

enableDataTransactions = false的意图是从实现中删除默认事务管理(我想从SimpleJpaRepository中删除)。它的行为就像没有指定@Transactional一样。然后,您可以控制服务层中的事务。

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

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

然而,

然而!如果在类型级别指定@Transactional,则Spring框架本身(与数据和JPA项目无关)将仅将其应用于在该类型中声明的方法,而不应用于继承的方法。我发现这种行为是正确的!只有覆盖方法,才能更改其规范和实现。

{{1}}

在此示例中,MANDATORY传播将适用于findOne,但它不会找到所有。

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

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

错误报告: