`
hugang357
  • 浏览: 181058 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

一对多关联关系的使用

    博客分类:
  • ssh
阅读更多
一对多关联关系的使用:

    一对多关系很常见,例如父亲和孩子、班级与学生的关系就是很好的一对多的关系。在实际编写程序时,一对多关系有两种实现方式:单向关联和双向关联。单向的一对多关系只需在一方进行映射配置,而双向的一对多需要在关联的双方进行映射配置。下面以Group(班级)和Student(学生)为例讲解如何配置一对多的关系。

1.单向关联

单向的一对多关系只需在一方进行映射配置,所以我们只配置Group(班级)的映射文件Group.hbm.xml,如例程9-6所示。

例程9-6  Group.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
<class name="test.Group" table="T_GROUP" lazy="true"><!--把类与表关联起来-->
<id name="id" column="ID"type="int">
<generator class="increment" >
</generator>
</id>
<property name="name" column="NAME" type="string"
update="true" insert="true" />
<set  name="students"
table="T_STUDENT"
lazy="false"
inverse="false"
cascade="all"
sort="unsorted"
>
<key column="ID"/>
<one-to-many class="test.Student"/>
</set>
</class>
</hibernate-mapping>

在以上映射文件中,<property>元素的insert属性表示被映射的字段是否出现在SQL的 INSERT语句中;update属性表示被映射的字段是否出现在SQL的 UPDATE语句中。

<set>元素描述的字段(本例中为students)对应的类型为java.util.Set,它的各个属性的含义如下。

name:字段名,本例的字段名为students,它属于java.util.Set类型。
table:关联表名,本例中,students的关联数据表名是t_student。
lazy:是否延迟加载,lazy=false表示立即加载。
inverse:用于表示双向关联中的被动方的一端,inverse的值为false的一方负责维护关联关系。默认值为false。本例中Group将负责维护它与Student之间的关联关系。
cascade:级联关系;cascade=all表示所有情况下均进行级联操作,即包含save-update和delete操作。
sort:排序关系,其可选取值为unsorted(不排序)、natural(自然排序)、comparatorClass(由某个实现了java.util.comparator接口的类型指定排序算法)。
<key>子元素的column属性指定关联表(本例中t_student表)的外键,<one-to-many>子元素的class属性指定了关联类的名字。

此外,在Group类中增加如下get/set方法:

private Set students;

    public Set getStudents() {
return this.students;
}
public void setStudents(Set stu) {
this.students = stu;
}

假如我们想为一个班级添加一个学生对象,实现的代码如下:

Transaction tx = session.beginTransaction();
Student stu = new Student();
stu.setName("Walker");
stu.setSex("male");
stu.setAge(22);

group.getStudents().add(stu);

session.save(group);
tx.commit();

2.双向关联

如果要设置一对多双向关联,那么还需要在“多”方的映射文件中使用<many-to-one>标记。例如,在Group与 Student一对多的双向关联中,除了Group的映射文件Group.hbm.xml和Group类进行设置和修改外,还需要在Student的映射文件Student.hbm.xm中加入:

<many-to-one
name="group"
class="test.Group"
cascade="none"
outer-join="auto"
update="true"
insert="true"
column="ID"
/>

name、class等属性前面已经解释过了,这里只说明insert和update属性。insert和update设定是否对column属性指定的关联字段进行insert和update操作。在Student类还要相应添加一对get/set方法:

public Group getGroup() {
return this.group;
}
public void setGroup(Group g) {
this.group = g;
}

此外,把Group.hbm.xml(如例程9-6所示)中的<set>元素的inverse属性的值设定为true,如下所示。

<set  name="students" table="T_STUDENT" lazy="false"
inverse="true" cascade="all" sort="unsorted">
<key column="ID"/>
<one-to-many class="Student"/>
</set>

当Group.hmb.xml中<set>元素的inverse属性的值设定为false时,Group和Student之间的关联关系由Group维护,Group负责将自己的id告诉Student,然后 Hibernate发送update语句去更新记录。但现在inverse的值设定为true后,Group和Student之间的关联关系转由 Student来维护,由Student自动去取得Group的id,而这个Student取得Group的id的动作,其实就是完成一个“学生添加到班级”的动作。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics