一個Person可以參加多個Event,一個Event有多個Person參加。
映射文件如下:
<!-- 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>
inverse=true的含義: 由雙向關聯另一方維護該關聯,己方不維護該關聯(只能進行查詢操作)。在上述代碼中,由Person方維護該<many-to-many>關系,示例代碼如下(以向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"的這方將失去這個雙向關系,而變成了一個單向關聯。
posted on 2006-06-15 17:16
想飛的魚 閱讀(2938)
評論(0) 編輯 收藏 所屬分類:
hibernate