spring - 为什么@Transactional 会自动保存到数据库

标签 spring jpa transactional

我有一个用@Transactional 注释的方法。我从我的数据库中检索一个对象,更改一个字段,然后从该方法返回。在不保存我的对象的情况下,数据库无论如何都会更新,这很奇怪。

您能告诉我如何避免这种行为吗?

最佳答案

这种行为是事务性的主要目的之一。

在事务方法即将返回之前,事务提交,这意味着对托管实体的所有更改都会刷新到数据库。

如果发生错误,事务将回滚,这意味着不会向数据库提交任何更改。

在尝试访问延迟加载的属性(可能是来自实体的集合)时,您可能会遇到 LazyInitializationException。当您从数据库中获取实体时,延迟加载的属性不会被实例化。

如果您在事务中访问延迟加载的属性,持久性提供程序将创建一个查询,实例化结果并将其附加到“父”实体。

编辑:如果您希望加载惰性属性并且能够更改您的实体而不将更改持久化到数据库,您可以使用惰性属性的获取连接来获取实体。

em.createQuery("SELECT e FROM MyEntity e JOIN FETCH e.lazyProp");

然后继续使用@orid 描述的方法之一。

如果您不使用 fetch 连接,则需要在事务中访问延迟加载的属性:

myEntity.getLazyProp().size();

注意对 size() 的调用。调用 getter 是不够的,因为您将获得一个代理。您需要执行需要来自属性的实际数据的操作。

关于spring - 为什么@Transactional 会自动保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552483/

相关文章:

hibernate - Spring-boot & hibernate,使用事务

java - 使用多个数据源的 Spring 事务管理

java - Spring @Transactional 方法中没有事务启动

java - Hibernate - Bitronix - Spring - 无法征用多个非 XA 资源

spring - Webflux JWT 授权无法正常工作

java - JPA:@SqlResultSetMapping 给了我两个对象,而不是一个

java - Maven、CDI、JUnit、JPA。想要针对 HSQLDB 运行测试

spring - 使用特定的 application.properties 文件将 Spring Boot 应用程序部署到 Heroku

java - lazy init 在 spring 中如何工作?

database - JPQL View 返回重复项