一对多关系很常见,例如父亲和孩子、班级与学生的关系就是很好的一对多的关系。在实际编写程序时,一对多关系有两种实现方式:单向关联和双向关联。单向的一对多关系只需在一方进行映射配置,而双向的一对多需要在关联的双方进行映射配置。下面以Group(班级)和Student(学生)为例讲解如何配置一对多的关系。
单向的一对多关系只需在一方进行映射配置,所以我们只配置Group(班级)的映射文件Group.hbm.xml
group 表结构:
create table "CLASSICCARS"."GROUPS"(
"ID" BIGINT not null,
"NAME" VARCHAR(20),
constraint "SQL140918025642540" primary key ("ID")
);
group pojo:
public class Groups {
private Long id;
private String name;
private Set student1;
}
Group.hbm.xml:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hibernateTest.Groups" table="GROUPS" schema="CLASSICCARS" lazy="true">
<id name="id" type="java.lang.Long" >
<column name="ID" />
<generator class="increment" />
</id>
<property name="name" type="java.lang.String" >
<column name="NAME" length="20" not-null="true"/>
</property>
<set name="student1" table="student1" lazy="false" inverse="false" cascade="all" sort="unsorted">
<key column="group_id" not-null="true"></key>
<one-to-many class="hibernateTest.Student1"/>
</set>
</class>
</hibernate-mapping>
<set>元素描述的字段对应的类型为java.util.Set,它的各个属性的含义如下:
1.name 字段名,本例的字段名为student1,它属于java.util.Set类型
2.table 关联表名,本例中student1的关联数据表名是student1.
3.lazy 是否延迟加载,lazy=false表示立即加载。
4.inverse:用于表示双向关联中的被动方的一端,inverse的值为false的一方负责维护关联关系。默认为false。本例的group将负责维护它与student之间的关联关系。
5.cascase 级联关系,cascade=all 表示所有情况下均进行级联操作,即包含save-update和delete操作。
6.sort 排序关系,其可选取的值为unsorted(不排序),natural(自然排序),comparatorClass(由某个实现了java.util.comparator接口的类型指定排序算法)。
<key>子元素的column属性指定关联表(本例中student表)的外键,<one-to-many>子元素的class属性指定了关联类的名字。
<p>Student1表结构:</p><p> create table "CLASSICCARS"."STUDENT1"(
"ID" BIGINT not null,
"NAME" VARCHAR(20),
"group_id" BIGINT,
"SEX" VARCHAR(5),
"AGE" BIGINT,
constraint "SQL140913082545570" primary key ("ID")
);group pojo:</p><p>
public class Student1{</p><p> </p><p> private Long id;
private String name;</p><p> private String sex;
private Long age;
private Long group_id; </p><p>}</p><p>Student1.hbm.xml:</p><p><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"<a target=_blank href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a>">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="hibernateTest.Student1" table="STUDENT1" schema="CLASSICCARS" lazy="false">
<id name="id" type="java.lang.Long">
<column name="ID" not-null="true"/>
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="20" />
</property>
<property name="sex" type="java.lang.String">
<column name="SEX" length="5" />
</property>
<property name="age" type="java.lang.Long">
<column name="AGE" />
</property>
</class>
</hibernate-mapping>
</p><p> </p>
注意:字段group_id不用在student 映射文件配置,因为在group那里以经有说明,否则会报重复错误。
public static void main(String[] args) {
// TODO Auto-generated method stub
Session session=HibernateSessionFactory.getSession();
Transaction tx=session.beginTransaction();
Student1 stu=new Student1();
Groups groups=(Groups) session.get(Groups.class, (long)3);
stu.setName("Linli");
stu.setSex("Femal");
stu.setAge((long)25);
session.save(groups);
tx.commit();
session.close();
}