Posted on 2011-01-03 23:53
viery 閱讀(325)
評論(0) 編輯 收藏
1.one to many 單向
這是一個用的比較多的對應關系,比如班級和學生,一個Classes對象對應著多個Stundent,那就需要在Classes類中持有對Stundent的引用,而此引用是一個Student對象的集合,因此應該在Classes的映射文件中描述此集合,因為hibernate對Set接口進行了擴展,所以Hibernate中的集合描述一般選擇Set。
Classes類:
private int id;
private String name;
private Set<Student> students;
Student類:
private int id;
private String name;
映射文件:
<class name="com.vle.domain.Classes" table="t_classes">
<id name="id"><generator class="native"/></id>
<property name="name"/>
<set name="student" >
<key column="classesid"/> <!--key標簽會在多的一端加入一個外鍵-->
<one-to-many class="com.vle.domain.Student"/>
</set>
</class>
映射一旦建立,能從Classes對象得到Student集合的迭代輸出,因為是單向,所以不能從學生得到班級。一般一對多設置成雙向,因為一旦將classesid屬性設置為非空,Classes在insert的時候會發生sql錯誤。所以很多時候關系由多的一方維護。
2.one to many 雙向
讓Student也知道和Classes的關系,反過來,是多個Student對象對應一個Classes對象,即many to one.此種關系是為了解決單向出現的問題,而不是需求驅動。
Student:
private Classes classes;
映射文件:
<class name="com.vle.domain.Student">
<id name="id"><generator class="native"/></id>
<property name="name"/>
<many-to-one name="classes" column="classesid"/>
</class>
這里藍色字體部分一定要與Classes映射文件中的外鍵字段對應,否則不能保存到同一個字段。同時,要一的一端禁用維護關系:
<set name="student" inverse="true">
反轉后只能查詢,不能更新。
3.many to many 單向
User-->Role 用戶與角色
User:
private int id;
private String name;
private Set<Role> roleSet;
Role:
private int id;
private String name;
映射文件:
<class name="User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roleSet" table="t_user_role">
<key column="userid"/>
<many-to-many class="Role" column="roleid"/>
</set>
</class>
4.many to many 雙向
只需要在Role類中引用User對象作為Set集合的元素并且在role映射文件中加入同樣的描述:
private Set<User> userSet;
<class name="Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="userSet" table="t_user_role">
<key column="roleid"/>
<many-to-many class="User" column="userid"/>
</set>
</class>
兩個映射文件對應的表格一定是同一個--t_user_role。