Hibernate中的一对多与多对一映射
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中的一对多与多对一映射的更多相关文章
- Hibernate之关联映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
- Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习一下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
- java web(六):mybatis之一对一、一对多、多对多映射
前言: 百度百科: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可 ...
- Hibernate 中一对多和多对多映射
1. 一对多映射 1.1 JavaWeb 一对多建表原则 多方表的外键指向一方表的主键; 1.2 编写一对多的 JavaBean // 客户(一方)和联系人(多方) // 客户(一方) JavaBea ...
- Hibernate中的一对多关系详解(2)
一对多的关系:例如,部门对员工,一个部门可以有多个员工 多对一的关系:例如,员工对部门,多个员工属于一个部门,并且每个员工只能属于一个部门 那么一对多.多对一在数据库中的是怎样表示的呢?好多话都不说了 ...
- Hibernate在关于一对多,多对一双向关联映射
[Hibernate]之关于一对多,多对一双向关联映射 因为一对多.和多对一的双向关联映射基本上一样,所以这里就一起写下来! Annotations配置 @Entity @Table(name=&qu ...
- Hibernate关联关系配置(一对多,一对一,多对多)
一对多 创建两个类 Manager(一这一端) Worker(多这一端) 即一个经理下有多个员工 package com.hibernate.n21; import java.util.HashS ...
- Hibernate的集合一对多与多对一
需求: 部门与员工 一个部门有多个员工; [一对多] 多个员工,属于一个部门 [多对一] 1.javaBean ——Dept.java package com.gqx.oneto ...
- Hibernate一对一、一对多、多对多注解映射配置
一对一: 一对多: 多对多:
随机推荐
- Linux socket编程应用学习笔记
参考这个系列吧 http://www.cnblogs.com/wunaozai/tag/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/default.html?page=2 ...
- D3.js 完整的柱形图
一个完整的柱形图包含三部分:矩形.文字.坐标轴.制作一个实用的柱形图,内容包括:选择集.数据绑定.比例尺.坐标轴等内容. 1. 添加 SVG 画布 //画布大小 var width = 400; va ...
- J2EE 第二阶段项目之分析业务
这次的项目为: 两金申报系统.主要是关系的练习,CRUD,统计. 这个项目没有pdf图,只有一本使用手册.(在我们出去工作后,做项目的时候,也可能只有项目需求的资料). 分析:每一张表都有分页,查看 ...
- VIm vi 使用 汇总
x 删除当前光标下的字符dw 删除光标之后的单词剩余部分.d$ 删除光标之后的该行剩余部分.dd 删除当前行. c 功能和d相同,区别在于完成删除操作后进入INSERT MODEcc 也是删除当前行, ...
- 常用的MYSQL 命令
例1:建立一个名为xhkdb的数据库 mysql> create database xhkdb; 例2:显示数据库 命令:show databases (注意:最后有个s)mysql> ...
- css读书笔记4:字体和文本
字体属性网页中的字体有3个来源:1.用户机器中安装的字体:2.保存在第三方网站上的字体.可以使用link标签把它们链接到页面中:3.保存在子集的web服务器上的字体.可以使用@font-face规则随 ...
- 可持久化Trie & 可持久化平衡树 专题练习
[xsy1629]可持久化序列 - 可持久化平衡树 http://www.cnblogs.com/Sdchr/p/6258827.html [bzoj4260]REBXOR - Trie 事实上只是一 ...
- 20145218 《Java程序设计》第01次实验报告
北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.08 实验名称:Java开发环境的熟悉(Linux + Eclipse) 实 ...
- swiper轮播图--兼容IE8
//引入idangerous.swiper.min.js var mySwiper = new Swiper ('.swiper-container', { loop: true, paginatio ...
- (17)odoo方法和修饰器
---------------------更新时间:11:06 2016-09-27 星期二18:06 2016-09-18 星期日10:31 2016-03-01 星期二-------------- ...