1.需求

  一个部门有多个员工;         【一对多】

  多个员工,属于一个部门    【多对一】

2.实体Bean设计

  Dept:

public class Dept {
private int depId;
private String depName;
private Set<Employee> emps = new HashSet<Employee>();
set...
get...
}

  Employee:

public class Employee {
private int empId;
private String empName;
private double salary;
private Dept dept;
set...
get...
}

3.配置映射文件

  Dept.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.juaner.hibernate.department">
<class name="Dept" table="t_dept">
<!--主键-->
<id name="depId">
<generator class="native"/>
</id>
<property name="depName" column="deptName" type="string"/>
<!--一对多关联映射的配置-->
<set name="emps" table="t_employee" >
<!--外键字段-->
<key column="dept_id"></key>
<!--一对多关系-->
<one-to-many class="Employee"/>
</set>
</class> </hibernate-mapping>

  Employee.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.juaner.hibernate.department">
<class name="Employee" table="t_employee">
<!--主键-->
<id name="empId" column="empId">
<generator class="native"/>
</id>
<property name="empName" column="empName" type="string"/>
<property name="salary" column="salary"/>
<!--多对一映射-->
<many-to-one name="dept" column="dept_id" class="Dept"></many-to-one>
</class> </hibernate-mapping>

4.保存数据

  • 使用“一”的一方来设置关联
    @Test
public void test1(){
Session session = sf.openSession();
session.beginTransaction(); //部门对象
Dept dept = new Dept();
dept.setDepName("开发部");
//员工对象
Employee employee = new Employee();
employee.setEmpName("张三");
employee.setSalary(1000);
Employee employee2 = new Employee();
employee2.setEmpName("李四");
employee2.setSalary(2000); dept.getEmps().add(employee);
dept.getEmps().add(employee2); session.save(dept);
session.save(employee);
session.save(employee2); session.getTransaction().commit();
session.close();
}

  此时会执行5条sql语句,其中最后两条update语句用来设置关联:

        Hibernate: insert into t_dept (deptName) values (?)
Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)
Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)
Hibernate: update t_employee set dept_id=? where empId=?
Hibernate: update t_employee set dept_id=? where empId=?
  • 使用“多”的一方来设置关联
    @Test
public void test2(){
Session session = sf.openSession();
session.beginTransaction(); //部门对象
Dept dept = new Dept();
dept.setDepName("人事部");
//员工对象
Employee employee = new Employee();
employee.setEmpName("张三");
employee.setSalary(1000);
Employee employee2 = new Employee();
employee2.setEmpName("李四");
employee2.setSalary(2000); employee.setDept(dept);
employee2.setDept(dept);
//先保存一的一方,再保存多的一方,关系会自动维护,减少不必要的语句
session.save(dept);
session.save(employee);
session.save(employee2); session.getTransaction().commit();
session.close(); }

  此时只执行三条sql语句:

Hibernate: insert into t_dept (deptName) values (?)
Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)
Hibernate: insert into t_employee (empName, salary, dept_id) values (?, ?, ?)

5.结果

  t_dept表:

  

  t_employee表:

  

6.inverse属性

  inverse属性用来设置是否控制反转。在一对多的映射中,只能在“一”的一方配置,默认值为false,即“一”的一方掌握控制权。inverse的值对数据的影响如下:

  • 保存数据 有影响

    如果设置控制反转,即inverse=true, 然后通过部门方维护关联关系。在保存部门的时候,同时保存员工, 数据会保存,但关联关系不会维护。即外键字段为NULL

  • 获取数据 无影响
  • 解除关联关系 有影响

    inverse=false,  可以解除关联

    inverse=true,  当前方没有控制权,不能解除关联关系(不会生成update语句,也不会报错)

  • 删除数据对关联关系 有影响

inverse=false, 有控制权, 可以删除。先清空外键引用,再删除数据

inverse=true,  没有控制权: 如果删除的记录有被外键引用,会报错,违反主外键引用约束!  如果删除的记录没有被引用,可以直接删除

7.cascade属性

  cascade属性用来设置级联方式,它有4个值:

none                 不级联操作, 默认值

save-update     级联保存或更新

delete               级联删除

all                     级联保存、更新、删除

Hibernate中的一对多与多对一映射的更多相关文章

  1. Hibernate之关联映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...

  2. Hibernate之关联关系映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习一下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...

  3. java web(六):mybatis之一对一、一对多、多对多映射

    前言: 百度百科: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...

  4. Hibernate 中一对多和多对多映射

    1. 一对多映射 1.1 JavaWeb 一对多建表原则 多方表的外键指向一方表的主键; 1.2 编写一对多的 JavaBean // 客户(一方)和联系人(多方) // 客户(一方) JavaBea ...

  5. Hibernate中的一对多关系详解(2)

    一对多的关系:例如,部门对员工,一个部门可以有多个员工 多对一的关系:例如,员工对部门,多个员工属于一个部门,并且每个员工只能属于一个部门 那么一对多.多对一在数据库中的是怎样表示的呢?好多话都不说了 ...

  6. Hibernate在关于一对多,多对一双向关联映射

    [Hibernate]之关于一对多,多对一双向关联映射 因为一对多.和多对一的双向关联映射基本上一样,所以这里就一起写下来! Annotations配置 @Entity @Table(name=&qu ...

  7. Hibernate关联关系配置(一对多,一对一,多对多)

    一对多 创建两个类  Manager(一这一端) Worker(多这一端)  即一个经理下有多个员工 package com.hibernate.n21; import java.util.HashS ...

  8. Hibernate的集合一对多与多对一

    需求:   部门与员工 一个部门有多个员工;       [一对多] 多个员工,属于一个部门    [多对一] 1.javaBean ——Dept.java package com.gqx.oneto ...

  9. Hibernate一对一、一对多、多对多注解映射配置

    一对一: 一对多: 多对多:

随机推荐

  1. latex输入希腊字母

    \alpha产生字符α;\beta产生字符β:\gamma产生字符γ:\delta产生字符δ;\epsilon产生字符ε; \zeta产生字符ζ:\eta产生字符η;\theta产生字符9; \iot ...

  2. Mvc4_传值取值应用

    Mvc路由运行机制:   首先,Web 浏览器向服务器发送一条URL 请求,如http://HostName/ControllerName/ActionName/Parameters. 其次,请求被A ...

  3. Windows 内存架构

    理解 Virtual Memory, Physical Memory, Committed Memory, Page File, Working Set, Modified Pages, Standb ...

  4. JavaScript设计模式与开发实践 - 策略模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...

  5. 常用的MYSQL 命令

    例1:建立一个名为xhkdb的数据库   mysql> create database xhkdb; 例2:显示数据库 命令:show databases (注意:最后有个s)mysql> ...

  6. The Network Adapter could not establish the connection问题研究

    最近一个项目会报上述错误,但也不是经常发生,所以很难跟踪,影响不是很大,但每次看到日志中这个错误就会不舒服,还是要想办法解决才是. 错误提示信息很明确是网络适配器不能创建连接. 查了很多资料,并且Or ...

  7. 设置westorm自动代码提示

    打开settings 然后在js文件下 打出co  按TAB键就出现了color了

  8. c头文件包含关系--记今天调试的郁闷经历

    c头文件包含关系--记今天调试的郁闷经历 彭会锋 2016-08-05  21:54:08 c头文件的包含

  9. 《javascript高级程序设计》 第23章 离线应用与客户端存储

    23.1 离线检测23.2 应用缓存23.3 数据存储 23.3.1 Cookie 23.3.2 IE 用户数据 23.3.3 Web 存储机制 23.3.4 IndexedDB   23.1 离线检 ...

  10. springMVC 验证器

    采用Hibernate-validator来进行验证,Hibernate-validator实现了JSR-303验证框架支持注解风格的验证.首先我们要到http://hibernate.org/val ...