我有以下方法 -
@Transactional
public void savethis(){
EntityObject t = entityManagerTreasury.getReference(EntityObject.class, 1);
t.setAction("abc");
}
现在,按照以下答案 -https://stackoverflow.com/a/1608621/4881766 https://stackoverflow.com/a/1608621/4881766
我应该只在我的 sql 日志中看到更新查询。
然而我观察到的行为如下 -
- 给定代码 - 选择然后更新
- 评论 t.setAction("abc");行 - 没有选择,没有更新
- 用 find() 替换 getReference() - 选择然后更新
我期望的行为是,如果我在代理上使用任何 getter,那么应该发出 select,但是当仅使用 setter 时,我希望在方法末尾提交更改,并进行更新,并且不进行选择发布。
事实证明,无论我对代理对象、getter 或 setter 做什么,它都会发出一个选择。
我想更新给定 ID 的实体的选定字段。
如果有任何方法可以更新我想要的任何字段而无需编写 jpql 或本机查询,我将非常感激。
提前致谢!
来自EntityManager.getReference() https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#getReference-java.lang.Class-java.lang.Object-文档:
获取一个实例,其状态可以被延迟获取。
因此,之后entityManagerTreasury.getReference
没有发出选择。
仅在那之后t.setAction("abc")
,如果尚未获取实体状态,则发出选择来获取状态。
重点是:除非获取实体状态,否则实体管理器无法保存实体的状态。因此你cannot跳过之前的选择,除非您使用 JPQL。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)