2011-08-08 42 views
6

我見過一個情景:一個由Hibernate數據庫觸發器和Hibernate

  1. saveupdate一些數據在目標表
  2. 有這將insertupdate之前執行對目標表的觸發器由Hibernate目標表
  3. select的操作了這個紀錄

但是我發現那些被觸發器修改過的字段並沒有被真正取出。 這是與Hibernate的事務提交(flush()已被調用)還是Hibernate緩存相關?謝謝。

回答

4

這可能是由第一個(會話)或第二個(例如ehcache)緩存引起的。要重新讀取實體,您需要調用session.refresh()。

hibernate docs從(在部分底部)

是可能的重新加載的對象和在任何時間 其所有集合,使用所述刷新()方法。當使用數據庫 觸發器初始化對象的某些屬性時,這很有用。

sess.save(cat); 
sess.flush(); //force the SQL INSERT 
sess.refresh(cat); //re-read the state (after the trigger executes) 
9

可以爲generated values屬性映射。這些值始終來自數據庫,無法存儲。 Hibernate會在插入或更新數據庫後自動在後續查詢中加載這些值。