小编典典

在休眠JPA的getReference()之后不使用setter发出select的情况下无法更新

hibernate

我有以下方法-

 @Transactional
 public void savethis(){
    EntityObject t = entityManagerTreasury.getReference(EntityObject.class, 1);
    t.setAction("abc");
 }

现在,符合以下答案-https:
//stackoverflow.com/a/1608621/4881766

我应该只能在sql日志中看到更新查询。

但是,我观察到的行为如下-

  1. 给定代码-选择然后更新
  2. 评论t.setAction(“ abc”); 行-没有选择也没有更新
  3. 用find()替换getReference()-选择然后更新

我期望的行为是,如果我在代理上使用任何getter,则应该发出选择,但是当仅使用setter时,我希望更改在方法的最后通过更新进行提交,而没有选择发行。

事实证明,无论我对代理对象,getter或setter做什么,它都会发出一个select。

我想更新给定ID的实体的选定字段。如果有任何方式可以更新我想要的任何字段而无需编写jpql或本机查询,我将非常感激。

提前致谢!


阅读 193

收藏
2020-06-20

共1个答案

小编典典

EntityManager.getReference()文档中:

获取一个实例,其状态可能会延迟获取。

因此,在entityManagerTreasury.getReference没有选择发出之后。

仅在之后t.setAction("abc"),如果尚未获取实体状态,则发出选择以获取状态。

关键是: 除非获取实体状态,否则实体管理器无法保存实体的状态 。因此,除非您使用JPQL,否则您 不能 跳过先前的选择。

2020-06-20