gpt4 book ai didi

Hibernate映射解析之关联映射详解

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Hibernate映射解析之关联映射详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

Hibernate中的关联映射 。

关联关系 。

平时开发中,类与类之间最普遍的的关系就是关联关系,而且关联是有方向的。 以部门(Dept)和员工(Employee)为例:一个部门下有多个员工,而一个员工只能属于一个部门.

从Employee到Dept的关联就是 多对一 关联。 这就说明 每个Employee对象只会引用一个Dept对象,因此在Employee类中应该定义一个Dept类型的属性,来引用所关联的Dept对象.

从Dept到Employee的关联就是 一对多 关联。这就说明 每个Dept对象会引用一组Employee对象,因此应该在Employee类中定义一个集合类型的属性,来引用所有关联的Employee对象.

如果仅有从Employee到Dept的关联或者仅有从Dept到Employee的关联,就称为单向关联。 如果同时包含两种关联,就是双向关联.

单向关联 。

Hibernate映射解析之关联映射详解

双向关联 。

Hibernate映射解析之关联映射详解

配置多对一的关联关系 。

  1. 以员工和部门为例,配置 员工到部门的单向多对一关联
  2. 在Employee类中定义Dept类型的属性 dept;

配置文件中配置 使用'many-to-one'进行配置 。

?
1
2
3
4
5
private Integer id;
private String name;
private Integer age;
private Integer sex;
private Dept dept; //引用所属的部门

映射文件 。

?
1
<many-to-one name= "dept" column= "dept" class = "com.ytzl.demo.entity.Dept" cascade= "save-update" ></many-to-one>
  1. name :属性名 这里就是 Employee中的dept
  2. column:外键字段 ,这里就是Employee表里的dept字段
  3. class :dept属性对应的类型 ,这里是 Dept类
  4. cascade:级联操作 这里是 保存和修改

配置一对多的关联关系 。

以员工和部门为例 ,从部门到员工的关联就是 一对多的关联 。

  1. 在Dept类中增加集合属性用来保存所引用的员工对象
  2. 在映射文件中配置 set

修改类属性 。

?
1
2
3
private Integer id;
private String name;
private Set<Employee> employees = new HashSet<>(); //用来保存员工引用

修改映射文件 。

?
1
2
3
4
5
<!-- 配置一对多的关联 -->
<set name= "employees" > <!-- name 对应的属性名 就是集合的名字 -->
  <key column= "dept" ></key> <!-- 对应的是 employee表的外键字段名 -->
  <one-to-many class = "com.ytzl.demo.entity.Employee" /> <!-- 关联的类 这里是 员工类 -->
</set>
  1. name :属性名 ,集合属性的名字
  2. key元素:column 属性 设定与所关联的持久化类对应的表的外键,这里是employee表的dept外键字段名
  3. one-to-many :class属性指定关联的持久化类 这里对应的是员工类

cascade 属性 关联操作 。

用于指定如何操作与当前对象关联的其他对象 。

可选值:

  1. none :默认值 ;不关联其他的对象
  2. save-update 当通过Session执行 save() ,update()saveOrUpdate()方法的时候级联更新或者保存所关联的对象
  3. delete :当通过session的delete()删除当前对象时,会级联 删除关联对象;
  4. all :包含 delete,save-update的行为

inverse属性 反转属性 。

在hibernate中,'inverse'属性指定了关联关系中的方向.

关联关系中,'inverse=”false”‘的为主动方,由主动方负责维护关联关系.

order-by属性 指定集合内元素的排序顺序 。

这里以员工和部门为例,部门内的员工要以年龄倒序的顺序排序,就可以通过设置 order-by属性 。

?
1
order-by= "age desc"

多对多关联 。

以 员工和项目为例,一个员工可以参与到多个项目中,每个项目有多个员工的参于 。

  1. 配置 Project类 ,在类中添加集合属性 用于保存员工引用
  2. 配置Employee类,在类中添加集合睡醒,用于保存项目引用

往往多对多映射涉及到第三张表 。

Project类 。

?
1
2
3
private Integer id;
private String name;
private Set<Employee> employees = new HashSet<>();

配置Project映射类 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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>
  1. set元素的table属性 对应第三张关联表
  2. key元素的column属性 对应project表在第三张表的外键
  3. many-to-many 元素 column对应关联对象在第三张表的外键

Employee类 。

?
1
2
3
4
5
6
private Integer id;
private String name;
private Integer age;
private Integer sex;
private Dept dept; //引用所属的部门
private Set<Project> projects = new HashSet<>(); //保存项目引用

Employee映射文件 。

?
1
2
3
4
<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>

延迟加载 。

当hibernate从数据库中加载Dept对象时,如果同时加载所有关联的Employee对象,而我们仅仅需要Dept对象,那么这些关联的对象就白白浪费了许多内存空间,这时就有了延迟加载,如果实际需要用到Employee时再去加载。hibernate使用lazy属性指定延迟加载的查询策略 。

hibernate允许在对象-关系映射文件中配置加载策略 。

  。

级别 说明
类级别 元素中lazy属性可选值为 true(延迟加载)和false(立即加载);默认值是true;
一对多关联级别 元素中lazy属性的可选值为 :true(延迟加载) ,extra(增强延迟加载),false(立即加载) 默认值为 true
多对一关联级别 元素中lazy属性的可选值为 :proxy(延迟加载),no-proxy(无代理延迟加载),和false(立即加载) ;默认值为 proxy

  。

总结 。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我的支持.

原文链接:https://sky-mxc.github.io/2017/01/13/hibernate-relate/ 。

最后此篇关于Hibernate映射解析之关联映射详解的文章就讲到这里了,如果你想了解更多关于Hibernate映射解析之关联映射详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com