Hibernate一对多、多对一映射
在自然界中事事物物纷纷扰扰,关系错综复杂,迷迷离离,我们不是在逃避关系而是我们忽略了这种错错综综的关系。那么作为一个程序员,在我们的世界中一切皆有联系,皆可以用程序去构建这个世界。这样或那样的联系有时候就产生了各种对应关系。
在我们的生活中存在着这样或者那样对应关系其中今天要讨论的是一对多、多对一关系,比如一颗大树有很多的叶子,每片叶子只能属于一棵大树。又比如公司中的一个部门有很对多员工,但是每个员工只能属于一个部门。这样的例子很多很多,所以今天我就根据Hibernate中的一对多、多对一映射。
我们就拿公司中部门和员工的关系举例子。首先反应在Department.java代码中是如下面这样的:
public class Department {
private Integer id;
private String name;
private Set<Employee> employees;
public Department() {
}
//各种属性的get和set方法
}
然后是Employee.java
public class Employee {
private Integer id;
private String name;
private String position;
private int salary;
private Department department;
public Employee() {
// TODO Auto-generated constructor stub
}
//属性的get和set方法
}
然后在Department.hbm.xml中的配置如下:
<class name="com.school.domain.Department" table="department">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="employees">
<key column="departmentId"></key>
<one-to-many class="com.school.domain.Employee" />
</set>
</class>
然后在Employee.hbm.xml中的配置如下:
<class name="com.school.domain.Employee" table="employee">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<property name="position"></property>
<property name="salary"></property>
<many-to-one name="department" lazy="false" column="departmentId"
class="com.school.domain.Department"></many-to-one>
</class>
然后特别需要注意的是DepartmentDao中保存的代码,这里特别需要注意的是有时候在具体的业务场景中并不是这样保存employee的,更多的是用EmployeeDao里面的save方法进行保存,但是一定要给Department对象的employees属性给设值才能指定一对多的关系:
public void saveDepartment(Department department) {
Session session = DBUtil.getSessionFactory().openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
for (Employee employee : department.getEmployees()) {
session.save(employee);
}
session.save(department);
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
transaction.rollback();
} finally {
session.close();
}
}
生成的表结构如下:
如上配置就做好了部门与雇员的一对多、多对一的编码。现在我们进行测试方法:
保存方法测试
@Test
public void testSave() {
Department department = new Department();
department.setName("002");
Set<Employee> employees=new HashSet<Employee>();
Employee emeploy1 = new Employee("001", "清洁工", 1000, department);
Employee emeploy2 = new Employee("002", "员工", 2000, department);
Employee emeploy3 = new Employee("003", "经理", 6000, department);
employees.add(emeploy1);
employees.add(emeploy2);
employees.add(emeploy3);
department.setEmployees(employees);
depmentDao.saveDepartment(department);
}
解除关系测试
@Test
public void removeRationship(){
//解除id为13的employee对应的Department的关系
Employee employee = emeployDao.getEmployee(13);
employee.setDepartment(null);
emeployDao.updateEmployee(employee);
//解除Department与之对应的Employees的关系
Department department = depmentDao.getDepartment(5);
department.getEmployees().clear();
depmentDao.updateDepartment(department);
}
删除:
@Test
public void remove(){
//删除Employee
Employee employee = emeployDao.getEmployee(17);
emeployDao.removeEmployee(employee);
/**
* 该方法会删除department表中Id为6的元组,
* 对应的employee并不会被删除只是解除了和department的关系
*/
Department department = depmentDao.getDepartment(6);
depmentDao.removeDepartment(department);
}
当然一对多、多对一也可以用其他的集合来进行比如List、Map、Array等但是在没有特殊的业务需要建议使用set来进行映射,因为像List和Array因为是有顺序的所以再删除的时候会要进行一些额外的操作。比如List结构的中有5个Employee,我们删除了<list-index>索引的前两个,那么我们在获取Department的employees的size的时候依然是5,因为其list-index的最大值依然是五。单丝Set因为是无序的所以不存在这个问题
相关推荐
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
1. 一对多映射(One-to-Many): 在这种关系中,一个实体(父实体)可以与多个其他实体(子实体)相关联。在Hibernate中,我们通常使用`@OneToMany`注解来表示这种关系。例如,一个学生可以有多个课程,而一门课程...
我们来详细探讨一下Hibernate一对多映射的实现方法、配置以及应用场景。 **1. 实体类定义** 在一对多映射中,我们需要至少两个实体类,一个是“一”的一方,另一个是“多”的一方。比如,一个`User`类(“一”方)...
首先,我们来理解一下一对多映射(One-to-Many Mapping)。在数据库设计中,一对多关系意味着一个父记录可以与多个子记录相关联。在Hibernate中,可以通过配置XML映射文件或使用注解来实现这种关系。例如,假设我们...
### Hibernate映射一对多关联关系 #### 知识点概览 - **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系...
理解并熟练掌握Hibernate的多对多映射是开发企业级Java应用的重要技能。通过源码学习,你可以深入了解Hibernate如何处理多对多关系的细节,从而更好地应用到实际项目中。在实际编程时,注意合理设计实体关系,确保...
在Hibernate中,可以通过以下方式实现一对多映射: 1. **配置文件映射**:在Hibernate的配置文件(如`hibernate.cfg.xml`)中,声明两个实体类对应的数据库表,并设置关联关系。 2. **实体类定义**:在Java实体类中...
在理解了一对多映射后,我们可以通过Hibernate API来处理这种关系: 1. 插入数据时,先创建父实体,然后在子实体中设置父实体的引用,最后保存子实体。Hibernate会自动处理外键的插入。 2. 查询时,可以从父实体...
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
本项目“hibernate一对多项目”旨在演示如何在JavaWeb应用中使用Hibernate处理一对多的关系映射。这里我们将深入探讨 Hibernate 的一对多关系、配置以及在实际项目中的应用。 首先,一对多关系在数据库中很常见,...
本篇主要探讨的是Hibernate中的一对多关联映射,它允许一个实体对象对应数据库表中的多个行。在实际业务场景中,这种映射模式非常常见,例如一个用户可以拥有多个订单,一个部门可以包含多个员工等。 首先,我们来...
一对多映射 一对一映射的反面是一对多,一个实体可以对应多个其他实体。这在Hibernate中可以通过`@OneToMany`注解来实现: ```java @Entity public class Department { @Id @GeneratedValue(strategy = ...
本文将详细解析"hibernate一对多映射"的概念、配置及其实现过程,以帮助理解并掌握这一核心特性。 首先,我们要明白在关系型数据库中,"一对多"关系意味着一个实体(比如一个部门)可以有多个相关实体(如部门下的...
本案例主要探讨的是Hibernate中的一对多关系映射,这是一种常见的对象关系映射(ORM)配置,用于表示一个实体与多个其他实体之间的关联。 在传统的数据库设计中,一对多关系是指一个表(父表)中的记录可以与另一个...
本主题聚焦于“Hibernate双向一对一关联映射”的注解实现,这是一种高级的数据库设计模式,用于处理两个实体之间一对一的关系。 在Hibernate中,一对一关联映射分为单向和双向。单向一对一映射通常涉及一个实体持有...
本篇主要探讨的是如何在Hibernate中实现一对多的单向关联映射。 一、概念理解 一对多关联意味着一个实体(如部门)可以有多个关联实体(如员工),而反过来,每个员工只属于一个部门。单向关联则表示只有部门知道其...
本篇文章将深入探讨Hibernate中的一对多和多对多关系映射。 首先,让我们理解一对多关联映射。在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联。在Hibernate中,这可以通过在实体类中...