gpt4 book ai didi

java - Hibernate getNamedQuery执行其他UPDATE TABLE

转载 作者:行者123 更新时间:2023-12-02 13:15:32 39 4
gpt4 key购买 nike

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

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/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com