getHibernateTemplate.load() 和get()之間的區別

今天我在hibernate 進行 getHibernateTempelete().delete(entity) 數據的時候

拋出了一個異常,異常信息是空值引用了一個非空值,意思就是說在刪除數據的時候ORM進行Mapping   映射時,將一個空值插入到了一個標識爲不能爲空的屬性中. 

 

經過一段仔細的研究後發現hibernate 在進行delete,update 操作的時候,必須將傳入的一個持久化Pojo對象,new 的對象是不行的,

 

需要在delete,update 時 加載持久化對象,所以我在加載的時候 ,選用了getHibernateTempelete.get(Entity.class,id)來獲取這一持久對象.

後來有人說需要在update,delete操作時推薦使用load(Entity.class,id) 方法.加載持久化對象,這樣可以在你緩存中讀取數據.

 

    這裏我搜了一點資料,是關於

getHibernateTempelete.get(Entity.class,id)和getHibernateTempelete.load(Entity.class,id) 的區別

 

 

1. getHibernateTemplate.load() 和get()之間的區別
主要的地方:
getHibernateTemplate.load() 存在延遲加載問題。
getHibernateTemplate.get() 不存在此問題,不採用lazy機制的。
1 當記錄不存在時候,get方法返回null,load方法產生異常,即get()可以取空的數據集,但load()不行。  
       take a look at the Hibernate documentation (though I agree is not very explicit)--the HibernateTemplate is basically a wrapper around the native Hibernate API.
       get() will return null if an object is not found while load() will always return a   non-null object which is a proxy. If the underlying object does not exist, the proxy will thrown ObjectNotFoundException.
       load() should be used when you are sure that the object exits while get() when
you're not.
2 load方法可以返回實體的代理類,get方法則返回真是的實體類
3 load方法可以充分利用hibernate的內部緩存和二級緩存中的現有數據,而get方法僅僅在內部緩存中
進行數據查找,如果沒有發現數據則將越過二級緩存,直接調用SQL查詢數據庫。
4 也許別人把數據庫中的數據修改了,load如何在緩存中找到了數據,則不會再訪問數據庫,而get則
會返回最新數據。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章