1. 程式人生 > >Hibernate 備忘知識點

Hibernate 備忘知識點

轉自:《JAVA EE 實用開發指南(基於Weblogic+EJB3+Struts2+Hibernate+Spring)》 作者:高洪巖

1)不可手動修改OID,因為將造成快取中的資料不準確。

2)Session介面中的update方法是將一個遊離物件轉變成持久物件的方案。

3)對於Session介面中的saveOrUpdate()方法,如果引數傳入的是瞬時物件就執行save,如果傳入的是遊離物件,就執行update。

4)Session介面中的load和get方法都具有查詢資料的功能。區別是,當資料庫中不存在指定的OID資料時,load方法報異常,而get方法返回空,get方法在主從表關係上取得從表的資料永遠立即檢索資料庫。load方法在主從表關係上取得從表的資料永遠返回代理類。

5)執行完一個save操作之後,最好使用session.flush()方法進行快取與資料庫的同步。經常出現的問題就是新建一條記錄,然後立即執行list.action時找不到剛才的記錄,主要原因就是快取的資料沒有和資料庫的同步。如果在執行save操作之後根本不需要訪問再訪問這個物件,也就沒有必要執行flush()方法。

6)Hibernate3.1預設是延遲載入,延遲載入(lazy)的意義主要體現在主從表上,如主貼與回帖。當使用延遲載入時,在根據一個主貼OID取得主貼資訊時,並不會自動取得與這個主貼相關聯的回帖。延遲載入的反方法為立即載入,如果使用立即載入,那麼根據一個OID取得主貼的同事會把資料庫中回帖的資料記錄也異同查詢出來,這樣就損失效能,所以要根據實際情況和資料量的大小來設定lazy的值是TRUE或FALSE。可以在set一端進行lazy的設定,如配置檔案。

7)如果正在使用延遲載入,並且在action中已經將session.close()關閉,那麼JSP中取得List中的子表資料會提示出錯:Exception sinitializing proxy-Could not initialize proxy -the owning Session was closed。解決辦法是哎session.close之後,將List中的物件使用方法Hibernate.initialize(代理物件引數)對List中的代理類進行例項化。或者使用Open Session In View的設計模式 來達到目的。Hibernate 中代理類的概念即只有一個OID屬性的類,所以使用延遲載入時,List中的字表資料都是代理類,在List中取得時就會出錯,所以要使用Hibernate.initialize(代理物件引數)方法進行代理類的例項化,最後需要注意的是匯入類import org.hibernate.Hibernate。

8)延遲載入只對load方法有效,對get方法是無效的,因此get方法永遠不會生成對映類的代理。

9)對於多對一或一對一關聯,應該優先採用外連線檢索策略,這樣比立即檢索策略使用的SQL語句更少。

10)使用Hibernate的ORM技術需要根據實際情況,對於超大資料量的軟體專案,不要為了Hibernate而Hibernate。