gpt4 book ai didi

spring-data - @EnableJpaRepositories.enableDefaultTransactions = false 不起作用

转载 作者:行者123 更新时间:2023-12-01 18:19:52 28 4
gpt4 key购买 nike

JavaDoc 读取

Configures whether to enable default transactions for Spring Data JPA repositories. Defaults to true. If disabled, repositories must be used behind a facade that's configuring transactions (e.g. using Spring's annotation driven transaction facilities) or repository methods have to be used to demarcate transactions.

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

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

我想禁用它。第一次尝试是在我的存储库 super 界面上放置 @Transactional(MANDATORY) 。那不起作用。

然后我注意到@EnableJpaRepositories注释中的“enableDefaultTransactions”。我将其设置为 false,但没有任何改变。 JavaDoc 让我相信它会完全实现我想要的功能:删除默认事务支持,并在尚未处于事务上下文中的情况下使用存储库时引发异常。

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

使用 spring data jpa 1.9.0.RELEASE。

最佳答案

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

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

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

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

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

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

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

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

错误报告:

关于spring-data - @EnableJpaRepositories.enableDefaultTransactions = false 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39152193/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com