一、Session在什麽情況下清理緩存?
答:
1、當應用程序調用Transaction.Commit()方法的時候,先清理緩存,然後再向數據庫提交事務。
2、當應用程序調用Session.Find()或者Iterate()方法時,如果緩存中的持久化對象的屬性發
生了變化,就會先清理緩存,以保證查詢的結果能反映持久化對象的最新狀態。
3、當應用程序顯式調用Session.Flush()方法的時候。
注意:Session進行清理緩存的例外情況是,如果對象使用native生成器來生成OID,那麽當調用Session的Save()
方法保存該對象時,會立即執行向數據庫插入該實體的insert語句
二、Session在清理緩存時,會按照什麽順序來執行Sql語句?
答:
1、按照應用程序調用Session.Save()方法的先後順序,執行所有對實體進行插入的insert語句。
2、執行所有對實體進行更新的update語句。
3、執行所有對集合進行刪除的delete語句。
4、執行所有對集合元素進行更新、刪除、插入的sql語句。
5、執行所有對集合進行插入的insert語句。
6、按照應用程序調用Sesson.delete()方法的先後順序,執行所有對實體進行刪除的delete語句。
三、Session清理緩存的三種模式
清理緩存的模式
Session查詢方法
Session的Commit方法
Session的Flush方法
FlushMode.Auto
清理
清理
清理
FlushMode.Commit
不清理
清理
清理
FlushMode.None
不清理
不清理
清理
四、Session的SaveOrUpdate方法如何工作,如何判斷一個對象是臨時對象還是遊離對象?
答:如何傳入的參數是臨時對象就調用Save()方法;如果傳入的對象是遊離對象,就調用Update()方法;如果傳入的參數是持久化對象就直接返回。
Hibernate判斷臨時對象的標准:
1、 實體對象OID爲null
2、 實體對象具有version屬性並且取值爲null
3、 在映射文件中爲<id>元素設置了unsaved-value屬性,並且OID取值與unsaved-value屬性值匹配。
4、 自定義Hibernate的Interceptor實現類,並且Interceptor的isUnsaved()方法返回Boolean.True。
五、在進行對象級聯的時候有一個cascade屬性,這個屬性的屬性值代表什麽意義?
cascade屬性值
描述
none
在保存、更新或者刪除對象時,忽略其他關聯的對象,它是級聯的默認值
save-update
當通過Session的Save()、Update()以及SaveOrUpdate()方法來保存、更新對象時,級聯保存關聯的臨時對象,並更新關聯的遊離對象。
delete
當通過Session的Delete()方法刪除當前對象時,同時會刪除關聯的所有對象。
all
包含save-update以及delete的行爲,此外對當前對象進行Evict()或者Lock()方法時會對關聯的對象進行同樣的操作。
delete-orphan
刪除所有和當前對象解除關聯關系的對象。
all-delete-orphan
包含all和delete-orphan的行爲。
六、Hibernate在與觸發器協同工作的時候如何保持數據的同步?
答:當Session執行Save()方法、SaveOrUpdate()方法、Update()方法時立即執行Session的Reflush()方法,直接繞過Session緩存從數據庫中加載數據,
七、如何改變Hibernate操作持久化對象的行爲?
答:通過對攔截器接口的實現改變Session的操作行爲。