当前位置: 首页 > 面试题库 >

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

卜凯旋
2023-03-14
问题内容

我有以下方法-

 @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或本机查询,我将非常感激。

提前致谢!


问题答案:

从EntityManager.getReference()文档中:

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

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

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

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



 类似资料:
  • 问题内容: 我正在使用Hibernate + JPA作为我的ORM解决方案。 我正在使用HSQL进行单元测试,并使用PostgreSQL作为真正的数据库。 我希望能够将Postgres的本机UUID类型与Hibernate一起使用,并在其String表示形式中将UUID与HSQL一起用于单元测试(因为HSQL没有UUID类型)。 我正在为Postgres和HSQL单元测试使用具有不同配置的持久性X

  • 问题内容: 我有一个关于乐观锁定Hibernate的问题。我试图深入了解Hibernate的乐观锁定,但是我有一个疑问。Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,您可以使用@Version批注(或xml配置)并创建一个version属性。另一个选项是使用optimistic- lock =“ all”属性进行配置而不进行版本控制。 我的问题是,如果您没有定义任何版本

  • 问题内容: 在引发约束违规异常之后,有什么方法可以继续使用线程绑定的hibernate会话吗?我在这里举一个简短的例子: 从现在开始,hibernate会话完全没有用,即使对于只读操作,例如使用OpenSessionInView模式在视图中呈现惰性集合。 问题答案: Session的文档指出, 如果Session引发异常,则必须回滚事务并丢弃会话。 发生异常后,会话的内部状态可能与数据库不一致。。

  • 问题内容: 我回到Java世界,并尝试使用JPA,Hibernate和PostgreSQL配置一个新的Spring Web应用程序。 我发现了许多带有各种XML配置文件的较早的示例,并且我想知道是否存在一种不依赖XML文件编写的执行该配置的首选新方法。 我需要配置的一些东西是hibernateSQL方言,驱动程序等。 问题答案: 将以下片段放入带有和注释的类中 Hibernate / JPA(编辑

  • 问题内容: 我有一个带有GET处理程序的简单控制器,该处理程序接受一个对象来绑定请求参数: 这是一个简单的POJO类: 一切正常,但我想摆脱设置者,使该对象不可变为公共使用。在Spring 5.0.2 之前的处理程序方法文档中,我们了解到可能的有效方法参数是: 命令或表单对象将请求参数绑定到Bean属性(通过设置器) 或直接 绑定 到字段 是否可以以某种方式覆盖默认的Spring Boot配置,以

  • 问题内容: 是否可以通过告诉布尔字段将字段更新为与其相反的字段而无需选择值来升级布尔字段-检查它然后相应地更新,这似乎很漫长… 我的意思的假例子 目前,我必须在一个查询中选择my_bool,然后对其值进行快速检查,以便可以在第二个查询中更新表。 我希望将其简化为单个查询(如果可能)? 问题答案: 使用