[b]Hibernate中的关联映射[/b]
[b]关联关系[/b]
平时开发中,类与类之间最普遍的的关系就是关联关系,而且关联是有方向的。
以部门(Dept)和员工(Employee)为例:一个部门下有多个员工,而一个员工只能属于一个部门。
从Employee到Dept的关联就是 多对一 关联。 这就说明 每个Employee对象只会引用一个Dept对象,因此在Employee类中应该定义一个Dept类型的属性,来引用所关联的Dept对象。
从Dept到Employee的关联就是 一对多 关联。这就说明 每个Dept对象会引用一组Employee对象,因此应该在Employee类中定义一个集合类型的属性,来引用所有关联的Employee对象。
如果仅有从Employee到Dept的关联或者仅有从Dept到Employee的关联,就称为单向关联。
如果同时包含两种关联,就是双向关联。
[b]单向关联[/b]
[img]http://img.1sucai.cn/uploads/article/2018010710/20180107100126_0_8228.jpg[/img]
[b]双向关联[/b]
[img]http://img.1sucai.cn/uploads/article/2018010710/20180107100127_1_74025.jpg[/img]
[b]配置多对一的关联关系[/b]
[list=1]
[*]以员工和部门为例,配置 员工到部门的单向多对一关联[/*]
[*]在Employee类中定义Dept类型的属性 dept;
[/*]
[/list]
配置文件中配置 使用'many-to-one'进行配置
private Integer id;
private String name;
private Integer age;
private Integer sex;
private Dept dept; //引用所属的部门
映射文件
<many-to-one name="dept" column="dept" class="com.ytzl.demo.entity.Dept" cascade="save-update"></many-to-one>
[list=1]
[*]name :属性名 这里就是 Employee中的dept[/*]
[*]column:外键字段 ,这里就是Employee表里的dept字段[/*]
[*]class :dept属性对应的类型 ,这里是 Dept类[/*]
[*]cascade:级联操作 这里是 保存和修改
[/*]
[/list]
[b]配置一对多的关联关系[/b]
以员工和部门为例 ,从部门到员工的关联就是 一对多的关联
[list=1]
[*]在Dept类中增加集合属性用来保存所引用的员工对象[/*]
[*]在映射文件中配置 set
[/*]
[/list]
[b]修改类属性[/b]
private Integer id;
private String name;
private Set<Employee> employees = new HashSet<>(); //用来保存员工引用
[b]修改映射文件[/b]
<!-- 配置一对多的关联 -->
<set name="employees"> <!-- name 对应的属性名 就是集合的名字 -->
<key column="dept"></key> <!-- 对应的是 employee表的外键字段名 -->
<one-to-many class="com.ytzl.demo.entity.Employee"/> <!-- 关联的类 这里是 员工类 -->
</set>
[list=1]
[*]name :属性名 ,集合属性的名字[/*]
[*]key元素:column 属性 设定与所关联的持久化类对应的表的外键,这里是employee表的dept外键字段名[/*]
[*]one-to-many :class属性指定关联的持久化类 这里对应的是员工类[/*]
[/list]
[b]cascade 属性 关联操作[/b]
用于指定如何操作与当前对象关联的其他对象
[b]可选值:[/b]
[list=1]
[*]none :默认值 ;不关联其他的对象[/*]
[*]save-update 当通过Session执行 [code]save()[/code] ,[code]update()[/code]及[code]saveOrUpdate()[/code]方法的时候级联更新或者保存所关联的对象[/*]
[*]delete :当通过[code]session的delete()[/code]删除当前对象时,会级联 删除关联对象;[/*]
[*]all :包含 delete,save-update的行为
[/*]
[/list]
[b]inverse属性 反转属性[/b]
在hibernate中,'inverse'属性指定了关联关系中的方向。
关联关系中,'inverse=”false”‘的为主动方,由主动方负责维护关联关系。
[b]order-by属性 指定集合内元素的排序顺序[/b]
这里以员工和部门为例,部门内的员工要以年龄倒序的顺序排序,就可以通过设置 order-by属性
[b]多对多关联[/b]
以 员工和项目为例,一个员工可以参与到多个项目中,每个项目有多个员工的参于
[list=1]
[*]配置 Project类 ,在类中添加集合属性 用于保存员工引用[/*]
[*]配置Employee类,在类中添加集合睡醒,用于保存项目引用[/*]
[/list]
往往多对多映射涉及到第三张表
[b]Project类[/b]
private Integer id;
private String name;
private Set<Employee> employees = new HashSet<>();
配置Project映射类
<?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>
<class name= "com.ytzl.demo.entity.Project" table ="project" dynamic-update="true">
<id name="id" column="p_id" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<property name="name" column="p_name" type="java.lang.String"></property>
<set name="employees" table="emp_pro_relate" cascade="save-update">
<key column="pro_id"></key>
<many-to-many class="com.ytzl.demo.entity.Employee" column="emp_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
[list=1]
[*]set元素的table属性 对应第三张关联表[/*]
[*]key元素的column属性 对应project表在第三张表的外键[/*]
[*]many-to-many 元素 column对应关联对象在第三张表的外键
[/*]
[/list]
[b]Employee类[/b]
private Integer id;
private String name;
private Integer age;
private Integer sex;
private Dept dept; //引用所属的部门
private Set<Project> projects = new HashSet<>(); //保存项目引用
[b]Employee映射文件[/b]
<set name="projects" table="emp_pro_relate" inverse="true">
<key column="emp_id"></key>
<many-to-many class="com.ytzl.demo.entity.Project" column="pro_id"></many-to-many>
</set>
[b]延迟加载[/b]
当hibernate从数据库中加载Dept对象时,如果同时加载所有关联的Employee对象,而我们仅仅需要Dept对象,那么这些关联的对象就白白浪费了许多内存空间,这时就有了延迟加载,如果实际需要用到Employee时再去加载。hibernate使用lazy属性指定延迟加载的查询策略
hibernate允许在对象-关系映射文件中配置加载策略
| 级别 |
说明 |
| 类级别 |
元素中lazy属性可选值为 true(延迟加载)和false(立即加载);默认值是true; |
| 一对多关联级别 |
元素中lazy属性的可选值为 :true(延迟加载) ,extra(增强延迟加载),false(立即加载) 默认值为 true |
| 多对一关联级别 |
元素中lazy属性的可选值为 :proxy(延迟加载),no-proxy(无代理延迟加载),和false(立即加载) ;默认值为 proxy |
[b]总结[/b]
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。