一对多关联关系的使用:
一对多关系很常见,例如父亲和孩子、班级与学生的关系就是很好的一对多的关系。在实际编写程序时,一对多关系有两种实现方式:单向关联和双向关联。单向的一对多关系只需在一方进行映射配置,而双向的一对多需要在关联的双方进行映射配置。下面以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的动作,其实就是完成一个“学生添加到班级”的动作。
分享到:
相关推荐
- **映射策略**:使用Hibernate进行一对多关联关系的映射。 - **API操作**:利用Hibernate API进行关联对象的级联操作。 #### 一、一对多关联关系概念 一对多关联关系是指一个实体可以与多个其他类型的实体关联,但...
在IT行业中,开发一个能实现一对多关联的通用EXCEL导入功能是一项常见的需求,尤其是在数据管理、数据分析或者系统集成的场景下。这个功能允许用户通过上传Excel文件来批量导入包含复杂关系的数据,例如一个学生可以...
在JPA中,一对多关联关系是常见的实体间关系类型,它表示一个实体可以与多个其他实体相关联。例如,一个学生可以有多个课程,一个部门可以有多名员工。在这个场景中,我们将深入探讨如何在JPA 2中实现一对多双向关联...
**一对多关联** 在数据库设计中,一对多关系意味着一个表的记录可以与另一个表的多个记录相关联。在Hibernate中,这种关系可以通过`@OneToMany`注解实现。例如,User类可能会有如下注解: ```java @Entity public ...
在实体类之间,Hibernate支持多种关联关系,包括一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)。本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,...
在Java的持久化框架Hibernate中,多对一(ManyToOne)关联关系是一种常见的对象关系映射(ORM)场景。这种关系通常出现在一个实体类拥有多条与另一个实体类相关的记录,而另一个实体类可能只有一条对应的记录。例如...
在 MyBatis 中,我们可以使用 `<collection>` 元素来处理一对多关联关系。 在 `<collection>` 元素中,我们可以配置以下几个属性: * `javaType`:指定映射到实体对象属性的类型,用于指定实体对象中集合类属性所...
在保存或更新实体时,Hibernate会自动处理一对多关联的插入或更新。 通过这种方式,我们就可以在Hibernate中设置一对多非主键关联,使得在操作部门和员工数据时,能够方便地维护它们之间的关系。这种方法允许我们在...
通过提供的源码`hibernateO2M_Dan`,我们可以进一步研究如何在具体场景中设置和使用这种一对多单向关联关系。这可能包括配置XML映射文件或使用注解的方式,以及在数据库交互中如何执行CRUD操作。文件中的示例代码将...
本篇将详细讲解如何在Mybatis中实现一对多关联映射的查询操作。 首先,我们要明确一对多关联映射的基本概念。在这个例子中,User表(用户表)和Order_form表(订单表)之间存在1-N的关系,意味着一个用户可以有多个...
本主题将深入探讨如何使用Hibernate实现一对一双向关联关系,并通过源码解析这一过程。 一对一双向关联关系指的是两个实体类之间存在一对一的关系,且在各自的类中都可以直接访问对方。这种关联可以通过注解或XML...
本篇文章将深入探讨“Hibernate一对多关联关系”这一主题,并结合提供的"hibernateOneToMany"压缩包文件,展示如何实现一个简单的一对多关联关系的小型示例。 首先,我们需要理解Hibernate中的一对多关联关系。在...
Mybatis实现一对一、一对多关联查询,关联查询:多个表联合查询,只查询一次,通过resultMap里面的、标签配置一对一、一对多;涉及到的一对一、一对多关系: - 班级classes、班主任teacher是一对一的关系 - 班级...
以下是实现多对多关联关系的关键步骤: 1. **定义实体类**:首先,为涉及多对多关联的两个实体创建对应的Java类。例如,假设我们有`User`和`Role`两个实体,它们之间的关系是多对多。 ```java @Entity public ...
由此可知,客户数据和订单数据是一对多的关系;那这样的话,问题就来了,我到底以订单中的哪一条数据为准呢?经过协商后一致同意以最新的一条数据为准; 数据测试初始化SQL脚本 DROP TABLE IF EXIST
本主题将主要聚焦在一对一和一对多关联。 2. **关联的方向性:** 关联可以是单向或双向的。单向关联只能从一个实体访问另一个,而双向关联允许两个实体之间互相访问。 3. **@OneToOne, @OneToMany, @ManyToOne ...
"一对多自关联"是数据库关系模型中的一个概念,尤其是在关系数据库中频繁出现。这种关联类型表示一个表中的单一记录可以与同一表中的多个其他记录相关联。例如,在一个公司员工管理系统中,一个部门可以有多名员工,...
### Hibernate关联关系(一对多) #### 一、概念与背景 在软件开发中,尤其是在数据库设计及ORM(对象关系映射)技术的应用中,“一对多”关系是非常常见的一种数据关联方式。例如,一个班级可以拥有多个学生,但每...
总之,理解并熟练掌握Hibernate的一对一、一对多和多对多关联关系,对于提升Java EE应用的开发效率和代码质量至关重要。通过实例化这些关系,开发者可以更好地管理和操作数据库中的复杂数据结构,从而实现更灵活和...
在一对一(One-to-One)主键关联关系中,两个实体类之间存在唯一对应的关系,通常一个实体对应另一个实体的一个实例,这种关系可以通过共享主键来实现。 在Hibernate中,一对一的主键关联关系可以通过以下几种方式...