2017-05-04 55 views
0

我有這樣的代碼。這是我知道的遺留代碼可能不是最好的。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沒有持久化也是如此。

回答

1

它實際上並沒有提交對Student的更改,如果您處於事務中,只是將它們刷新到數據庫。當您在Query對象上調用executeUpdate時,它會在執行查詢之前執行所有掛起更改的刷新,以確保數據一致性。

您的loadStudentById顯然返回一個託管實體,它由Hibernate跟蹤。它保留原始狀態的副本,並將其與每次刷新時對象的當前狀態進行比較。如果你不想跟蹤它的變化,你可以調用session.detach(student)(如果使用Hibernate 5.2,它與EntityManager接口合併)。

+0

請參閱我編輯的問題.. – chiperortiz

+0

那麼它更新一次,因爲你改變了管理對象,就像我說的,第二次是你正在運行的手動查詢。 Flush將所有更改發送到沒有「@Column(updatable = false)」的DB字段或子實體的相應級聯選項。如果你願意,你可以在你的實體上設置新的屬性,並調用'session.flush()'來在數據庫中更新它們。 – coladict

+0

謝謝朋友很好的回答 – chiperortiz