在向大家詳細介紹Hibernate之前首先讓大家了解下Hibernate基礎然後全面介紹get和load有兩個重要區別
Hibernate基礎之關聯
◆單向關聯 單向關聯沒有inverse用法
◆雙向關聯 使用inverse來指定inverse=false(默認值)表示自己是關聯的擁有者Inverse=true表示另一端是關聯的擁有者
如何管理雙向關聯?
必須顯示地管理關聯的兩端對一端進行了修改兩端都要重新設置要保持同步如何決定關聯的擁有者(一般來說擁有外鍵的一端就是關聯的擁有者?????)
◆一對一 任何一端都可以作為關聯的擁有者但是應該選擇其中之一(而且只 能選擇一個)如果沒有指定擁有者就會導致循環依賴
◆一對多 多端必須作為關聯的擁有者(一般都是多端擁有外鍵???)
◆多對一 多端必須作為關聯的擁有者 (一般都是多端擁有外鍵???)
◆多對多 任何一端都可以作為關聯的擁有者
Hibernate基礎之saveOrupdate()使用
保存已經持久化的對象是不合適的同樣更新瞬時對象也不合適的如果從應用程序代碼判斷對象的狀態是不可能的或者不方便那麼可以使用saveOrUpdate()方法
Hibernate基礎之load()與get()
public Object load(Class theClass Serializable id) throws HibernateException
public Object load(String entityName Serializable id) throws HibernateException
public Object get(Class clazz Serializable id) throws HibernateException
public Object get(String entityName Serializable id )thtows HibernateException
Hibernate中get方法和load方法的根本區別在於
對於get方法Hibernate會確認一下該id對應的數據是否存在首先在session緩存中查找然後在二級緩存中查找還沒有就查詢數據庫數據庫中沒有就返回null
load方法加載實體對象的時候根據映射文件上class級別的lazy屬性的配置(默認為true)分情況討論
◆若為true則首先在Session緩存中查找看看該id對應的對象是否存在不存在則使用延遲加載返回實體的代理類對象(該代理類為實體類的子類由CGLIB動態生成)等到具體使用該對象的時候 再查詢二級緩存和數據庫若仍沒發現符合條件的記錄則會拋出一個ObjectNotFoundException
◆若為false就跟get方法查找順序一樣只是最終若沒發現符合條件的記錄則會拋出一個ObjectNotFoundException
這裡get和load有兩個重要區別
如果未能發現符合條件的記錄get方法返回null而load方法會拋出一個ObjectNotFoundExceptionload方法可返回沒有加載實體數據的代理類實例而get方法永遠返回有實體數據的對象(對於load和get方法返回類型好多書中都說get方法永遠只返回實體類實際上並不正確get方法如果在session緩存中找到了該id對應的對象如果剛好該對象前面是被代理過的如被load方法使用過或者被其他關聯對象延遲加載過那麼返回的還是原先的代理對象而不是實體類對象如果該代理對象還沒有加載實體數據(就是id以外的其他屬性數據)那麼它會查詢二級緩存或者數據庫來加載數據但是返回的還是代理對象只不過已經加載了實體數據)
Hibernate基礎之刷新實體
Hibernate提供了一種用數據庫表刷新(refresh)持久對象的機制使用Session接口的refresh()方法的其中之一刷新持久對象的實例
Public void refresh(Object object) throws HibernateException
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28031.html