Posted on 2011-01-03 23:53
viery 阅读(322)
评论(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。