舉個最簡單的一對多父子關係。那麼代碼就寫成:html
Parent p = new Parent(); Child c = new Child(); c.setParent(p); //維護父子之間關係 p.getChildren().add(c); session.save(p); session.flush();映射文件配置:
父親中的關係映射 {set name="children" lazy="true" inverse="true"} {key column="parent_id"/} {one-to-many class="test.Child"/} {/set} 兒子中關係映射 {many-to-one name="parent" column="parent_id" not-null="true"/}
set中inverse="true",說明父子關係只在多的一端(Child)維護。因此只會發出2個insert語句。java
注意:{many-to-one}老是設成「inverse=false」的,並且這個屬性在Mapping中是不存在的!sql
這樣運行的下來的結果就是:Hibernate: insert into parent (id) values (?) Hibernate: insert into child (parent_id, id) values (?, ?)
若是將set中的inverse設爲true,那麼會發出3條sql語句,前2條是insert語句,後1條是update語句用來維護parent和child類的父子關係。數據庫
固然,假如c.setParent(p)註釋掉(破壞了父子關係),結果就變成了:session
Hibernate: insert into parent (id) values (?)
===================================================
(實例2):
一個Person能夠參加多個Event,一個Event有多個Person參加。映射文件以下:
app
<!-- Person.hbm.xml --> <hibernate-mapping package="events"> <class name="Person" table="person"> <id name="id" column="person_id"> <generator class="native"/> </id> <property name="age" length="0"/> <property name="firstname"/> <property name="lastname"/> <set name="events" table="person_event"> <key column="person_id"/> <many-to-many column="event_id" class="events.Event"/> </set> </class> </hibernate-mapping> <!-- Event.hbm.xml --> <hibernate-mapping> <class name="events.Event" table="events"> <id name="id" column="event_id"> <generator class="native"/> </id> <property name="date" column="events_date" type="timestamp"/> <property name="title" column="events_title"/> <set name="participants" table="person_event" inverse="true"> <key column="event_id"/> <many-to-many column="person_id" class="events.Person"/> </set> </class> </hibernate-mapping>
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();
Inverse:負責控制關係,默認爲false,也就是關係的兩端都能控制,但這樣會形成一些問題,更新的時候會由於兩端都控制關係,因而重複更新。通常來講有一端要設爲true。spa
Cascade:負責控制關聯對象的級聯操做,包括更新、刪除等,也就是說對一個對象進行更新、刪除時,其它對象也受影響,好比我刪除一個對象,那麼跟它是多對一關係的對象也所有被刪除。
舉例說明區別:刪除「一」那一端一個對象O的時候,若是「多」的那一端的Inverse設爲true,則把「多」的那一端全部與O相關聯的對象外鍵清空;若是「多」的那一端的Cascade設爲Delete,則把「多」的那一端全部與O相關聯的對象所有刪除。hibernate
版權聲明:本文爲博主原創文章,未經博主容許不得轉載。code