posts - 68, comments - 19, trackbacks - 0, articles - 1
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。

只有注册用户登录后才能发表评论。


网站导航: