1. 程式人生 > >hibernate的級聯、延遲載入、inverse屬性

hibernate的級聯、延遲載入、inverse屬性

          hibernate的級聯是用來說明資料庫中二個表之間的相互關係(one---to ---one, one ---to---many, many---to---many)。當對主物件做某種操作時,是否對其相關聯的子物件也做相對應的操作。

常見的級聯(cascade)有:

(1) none: 表示在儲存、修改、刪除時不對其級聯物件不做任何的操作,它是預設值。

(2)save-update:表示在儲存和更新時,級聯儲存、更新附屬物件。

(3)delete:表示在刪除當前物件時,級聯刪除附屬物件。

(4)all:表示所有情況下均進行級聯操作,比如:save-update, delete操作等。

(5)delete--orphan: 表示刪除當前物件的同時,刪除與當前物件解除關係的孤兒物件。(僅限於用在一對多上面。)

        hibernate的延遲載入(Lazy  load):這種技術被廣泛的運用,這種延遲載入能夠保證應用只有在需要的時候才去資料庫抓取相應的資料記錄,通過延遲載入技術能夠避免過多,過早的載入資料庫表中的資料,從而減少應用記憶體的開銷。hibernate的延遲載入實質上是一個代理模式的運用,當程式通過hibernate裝載一個實體時,預設情況下hibernate不會馬上去抓取它的集合屬性、關聯實體所對應的記錄。而是通過一個代理來生成這些集合屬性,和關聯實體,這就是代理的優勢。

例如: 在一個級聯關係:部門-----員工(one---many)的表中,當進行一些操作時,要想優化它的效能就把lazy設為true。

        hibernate的inverse屬性:Inverse是雙向關係中的基本概念,當然對於多數實體我們並不需要雙向關聯,更多的是選擇單項關聯。inverse的使用或設定不當會導致效能的下降,既會產生多餘的sql,甚至會有jdbc異常產生。例如:在雙向關聯當中,如果雙放inverse都設定為true,那麼雙方將都不會維護關係的更新,如果雙方inverse都設定為false的話,必然後導致雙方維護同一個關係。所以雙向關聯中,最好一端inverse=true,一端inverse=fase。一般情況下會把inverse=fase放在many端。