我有這樣的代碼。這是我知道的遺留代碼可能不是最好的。Hibernate getNamedQuery執行其他UPDATE TABLE
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日誌,我可以看到兩個更新的第一個像這樣的定期更新。
休眠UPDATE
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字段,我的意思就像我剛剛在executeUpdate之前做的那樣?學生沒有任何地方犯下。
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
是否平齊做財產在DB堅持?????因爲我修改屬性並更新到數據庫中,即使namedQuery沒有持久化也是如此。
請參閱我編輯的問題.. – chiperortiz
那麼它更新一次,因爲你改變了管理對象,就像我說的,第二次是你正在運行的手動查詢。 Flush將所有更改發送到沒有「@Column(updatable = false)」的DB字段或子實體的相應級聯選項。如果你願意,你可以在你的實體上設置新的屬性,並調用'session.flush()'來在數據庫中更新它們。 – coladict
謝謝朋友很好的回答 – chiperortiz