一、inverse是hibernate雙向關係中的基本概念。inverse的真正作用就是指定由哪一方來維護之間的關聯關係。當一方中指定了「inverse=false」(預設),那麼那一方就有責任負責之間的關聯關係,說白了就是hibernate如何生成sql來維護關聯的記錄
hibernate僅僅按照主控方物件的狀態的變化來同步更新資料庫。按照原來的對映文 件,people.getaddresses().add(address),即主控方物件的狀態發生了改變,因此資料庫會跟著物件狀態的變化來同步更新 資料庫;而address.setpeople(people),即被控方物件的狀態發生了改變,它是不能觸發物件和資料庫的同步更新的。
(例項1):
舉個最簡單的一對多父子關係。那麼**就寫成:
父親中的關係對映
兒子中關係對映
inverse=true的含義: 由雙向關聯另一方維護該關聯,己方不維護該關聯(只能進行查詢操作)。在上述**中,由person方維護該關係,示例**如下(以向person參與的event中加入新的event為例):
session session = hibernateutil.getsessionfactory().getcurrentsession();
session.begintransaction();
person p = (person) session.load(person.class, personid);
event e = (event) session.load(event.class, eventid);
p.getevents().add(e);//執行該**時,hibernate會向中間表 person_event中插入person_id和event_id記錄,如果換成e.getparticipants().add(p)的話,該**將不會被執行,即hibernate不會向表person_event中插入記錄。
session.gettransaction().commit();
要注意的一點:在雙向關聯的關係中,對映的column(和table)的值要一致(即要用相同的表名和列名),不然設定為inverse="true"的這方將失去這個雙向關係,而變成了乙個單向關聯。
二、inverse和cascade的比較
inverse:負責控制關係,預設為false,也就是關係的兩端都能控制,但這樣會造成一些問題,更新的時候會因為兩端都控制關係,於是重複更新。一般來說有一端要設為true。
cascade:負責控制關聯物件的級聯操作,包括更新、刪除等,也就是說對乙個物件進行更新、刪除時,其它物件也受影響,比如我刪除乙個物件,那麼跟它是多對一關係的物件也全部被刪除。
舉例說明區別:刪除「一」那一端乙個物件o的時候,如果「多」的那一端的inverse設為true,則把「多」的那一端所有與o相關聯的物件外來鍵清空;如果「多」的那一端的cascade設為delete,則把「多」的那一端所有與o相關聯的物件全部刪除。
hibernate中generator屬性的意義
1 identity 用於mysql資料庫。特點 遞增 注 對於mysql資料庫使用遞增序列時需要在建表時對主鍵指定為auto increment屬性。2 sequence 用於oracle資料庫 序列名3 native 跨資料庫時使用,由底層方言產生。default.sequence為hibern...
hibernate中取得connection的方法
在hibernate3中,使用了c3p0連線池,嘗試了多種辦法取得connection物件,以下兩種可以使用。connection conn 方法1 hibernate4中將要廢棄這個方法 conn session.connection 方法2 這個方法也可以用,速度稍慢 sessionfactor...
Hibernate中的快取技術
根據我學習的框架的經驗,在shh整合框架中,hibernate是最難學習的了。hibernate中有許多要點,還得掌握一下啊,像懶載入lazy 級聯cascade 事物控制 還有快取和二級快取哦。首先我們先來了解一下快取 所謂快取就是介於應用程式和物理資料來源之間的資料。能夠降低應用程式對物理資料訪...