java - Hibernate getNamedQuery执行其他UPDATE TABLE

标签 java sql hibernate named-query

我有这样的代码。我知道这是一个遗留代码,也许不是最好的。

final Student student = loadStudentById(13);
student.setLastAccessedTime(new Date());
student.setNote(20);
updateWithHQLUsingNamedQueries(student);//HERE WE UPDATE BOTH FIELDS USING NAMEDQUERIES

 private void updateWithHQLUsingNamedQueries(final Student student){
     final Query query = session.getNamedQuery("namedQuery"); 
     query.setParameter("lastAccessedTime",student.getLastAccessedTime());
     query.setParameter("note",student.getNote());
     query.setParameter("c01",c01Field);
     query.executeUpdate();//HERE HIBERNATE UPDATE THE STUDENT LIKE session.update(student);
 }

我们也正在使用

@org.hibernate.annotations.DynamicUpdate(value=true)
@org.hibernate.annotations.SelectBeforeUpdate(value=true)

一切正常,但在 SQL 日志记录中我可以看到两个更新,第一个更新就像这样的常规更新。

hibernate 更新

update com.models.Student HIBERNATE MESSAGE
update student set lastAccessedTime=:time and note=:note where id=:id

后来我看到了namedQueries的更新

update student set c01=:c01 and lastAccessedTime=:time and note=:note where id=:id

我的问题是?

为什么 Hibernate 在定期更新中提交 Student 字段,我的意思是就像我在执行更新之前做了类似的事情?该学生没有 promise 任何地方。

session.update(student);

我知道他们只更新脏字段,因为我使用的是DynamicTrue,也许最后一次更新(NamedQuery)似乎浪费了。但是为什么 Hibernate 像定期更新一样提交学生对象???导致两次更新?降低性能?

感谢@coladit的回答,但如果我修改我的代码设置另一个像这样的属性

final Student student = loadStudentById(13);
student.setLastAccessedTime(new Date());
student.setNote(20);
student.setAnotherProperty(value);//THIS CHANGE IS PERSISTED IN DB

刷新后属性是否会持久保存在数据库中???因为我修改了属性并更新到数据库中,即使 nameQuery 没有持久化..

最佳答案

如果您处于事务中,它实际上不会将更改提交给 Student,它只是将更改刷新到数据库。当您对 Query 对象调用 executeUpdate 时,它会在执行查询之前刷新所有挂起的更改,以确保数据一致性。

您的 loadStudentById 显然返回一个托管实体,该实体由 Hibernate 跟踪。它保留原始状态的副本,并在每次刷新时将其与对象的当前状态进行比较。如果您不希望跟踪其中的更改,可以调用 session.detach(student) (如果使用 Hibernate 5.2,它与 EntityManager 接口(interface)合并)。

关于java - Hibernate getNamedQuery执行其他UPDATE TABLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43781653/

相关文章:

java - 使用可怕的克隆成语是克隆未知(子)类型对象的唯一方法吗?

java - 使用 eclipse buildship 创建的新项目配置不正确(无法识别包)

sql - 这个 T-SQL select 语句有什么问题?

php - 使用 sql 表中的数据创建 php/html 表的术语,但 php 表值是根据 sql 数据计算的

java - 如何使用 JPA 2、Hibernate 3.5 处理选择字段

java - 如何在Android应用程序的按钮中显示数学公式?

java - 当我尝试删除多个选定的行时;只有少数被删除,并非全部

mysql - 省略公共(public)记录的 SQL 外连接

java - 使用 hibernate 获取空字符串的 where 子句中的所有值

java - 延迟初始化异常