2012-10-22 53 views
0

我對會話中的hibernate bean setter的行爲感到困惑。我認爲,當你在一個會話中設置一個bean字段時,hibernate只知道這個bean是髒的,並且在session關閉時,這是一個掛起的更新,它將被刷新到數據庫。但是,我在一個hibernate會話中運行了一個測試,在這個會話中,我通過它的id獲取了一個bean,將一個字段從true更改爲false,然後對這個字段爲false的所有bean進行HQL查詢。在結果集中出現「髒」的bean,就好像hibernate在調用setter時已經創建了數據庫UPDATE一樣。然後,我在離開會話之前做了一個session.clear(),取消未決更新並驅逐所有bean。我認爲這會有效地擺脫二傳手電話的骯髒變化。然而我檢查了數據庫,記錄了從真到假的變化。注意:在此會話中從不調用session.flush()。hibernate:更改bean字段,然後發出查詢,查詢看到更改字段

看來,只要我調用bean setter,Hibernate就必須發出數據庫UPDATE調用。但是這看起來不正確?

Andy

回答

1

這是正確的,休眠刷新查詢之前的任何未決更改(如果它決定掛起的變化可能會影響查詢結果)。如果您不想保存對數據庫的任何更改,則必須回滾事務。如果您致電clear()但提交該事務,則它將被保留在數據庫中,因爲clear()被調用得太晚(在SQL UPDATE之後)。或者按照kamlesh的建議更改清洗模式,但要確保在選擇特定的清洗模式時知道自己在做什麼。 PS:歡迎來到Hibernate世界。期待更多這樣的驚喜。

0

只要檢查會話FlushMode的休眠。 如果它的一個總是自動模式,然後hibernate將髒數據刷新到數據庫,在執行新的查詢之前。

java doc for FlushMode