Hibernate Session方法小結

[size=medium]hibernate session中的load方法返回的一個POJO的代理對象,只有在訪問其field時才進行實際的數據裝載(向數據庫發出一條select查詢),如果該通過getter方法來訪問其field值,但是session已經close,將拋出延遲初始化的異常。如果load加載的是一條不存在的數據,在該entity的field訪問時,將拋出ObjectNotFoundException的異常。
對於session中的get方法,將會實時返回一個實際的POJO對象,而不是load中返回的代理對象。調用get時將立即發出select查詢。對於不存在的數據記錄,get將返回一個null值,在調用其方法時將產生NullPointerException。

hibernate session中的update方法用來更新對應的pojo對象到數據庫中。update方法可以更新一個detached對象,前提條件是該detached對象必須包含id值,並且該update會更新該pojo對象中所有的值到數據庫中(根據hbm文件中的配置)。update方法同時也可以更新一個persistence對象到數據庫中,如果pojo對象已經是persistence對象(也就是已經存在於session的cache中),進行更新操作只需設置爲對應的field值,甚至不需要調用update方法,在session關閉時會自動同步到數據庫中。
hibernate中對於merge操作同樣能達到持久化的目的,那麼他和update方法有什麼區別呢?merge方法在進行更新操作時,會首先判斷該pojo對象是否是一個persistence對象,如果不是,那麼他會首先根據id發出一條select查詢,並將查詢出的新對象加入到session的cache中,納入session的生命週期管理中,然後再根據變化進行update。

對於update一個detached對象將導致的全盤update,就是所有在xml配置中的列都將進行update。可以通過在xml的class元素上設置dynamic-update屬性和merge方法來避免所有列的update。merge由於merge方法將自動發出一條select查詢來將detached對象納入session的管理,所有對於大批量的操作可能將產生性能問題。建議使用update query來進行部分列的更新。這種特性在hibernate 3.3中才被加入到hibernate中。[/size]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章