我有一个用@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/