我有一个用@Transactional注释的方法。我从数据库中检索一个对象,更改一个字段,然后从该方法返回。不保存我的对象,无论如何都会更新数据库,这很奇怪。
您能告诉我如何避免这种行为吗?
这种行为是交易性的主要目的之一。
在事务方法即将返回之前,事务将提交,这意味着对托管实体的所有更改都将刷新到数据库中。
如果发生错误,则事务将回滚,这意味着不会对数据库提交任何更改。
你可能会得到LazyInitializationException
尝试从实体访问延迟加载的特性,可能是一个集合时。从数据库中获取实体时,不会实例化懒惰的属性。
如果您访问事务中的延迟加载属性,则持久性提供程序将创建一个查询,实例化结果并将其附加到“父”实体。
编辑:如果您希望加载惰性属性,并且能够在不将更改持久保存到数据库的情况下更改您的实体,则可以使用用于惰性属性的获取联接来获取实体。
em.createQuery("SELECT e FROM MyEntity e JOIN FETCH e.lazyProp");
然后继续使用@orid描述的方法之一。
如果不使用提取联接,则需要在事务内部访问延迟加载的属性:
myEntity.getLazyProp().size();
请注意对的调用size()
。仅仅调用getter是不够的,因为您将获得代理。您需要执行需要该属性中的实际数据的操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句