Hibernate映射解析之关联映射详解
发布时间 - 2026-01-10 23:17:45 点击率:次Hibernate中的关联映射

关联关系
平时开发中,类与类之间最普遍的的关系就是关联关系,而且关联是有方向的。
以部门(Dept)和员工(Employee)为例:一个部门下有多个员工,而一个员工只能属于一个部门。
从Employee到Dept的关联就是 多对一 关联。 这就说明 每个Employee对象只会引用一个Dept对象,因此在Employee类中应该定义一个Dept类型的属性,来引用所关联的Dept对象。
从Dept到Employee的关联就是 一对多 关联。这就说明 每个Dept对象会引用一组Employee对象,因此应该在Employee类中定义一个集合类型的属性,来引用所有关联的Employee对象。
如果仅有从Employee到Dept的关联或者仅有从Dept到Employee的关联,就称为单向关联。
如果同时包含两种关联,就是双向关联。
单向关联
双向关联
配置多对一的关联关系
- 以员工和部门为例,配置 员工到部门的单向多对一关联
- 在Employee类中定义Dept类型的属性 dept;
配置文件中配置 使用'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>
- name :属性名 这里就是 Employee中的dept
- column:外键字段 ,这里就是Employee表里的dept字段
- class :dept属性对应的类型 ,这里是 Dept类
- cascade:级联操作 这里是 保存和修改
配置一对多的关联关系
以员工和部门为例 ,从部门到员工的关联就是 一对多的关联
- 在Dept类中增加集合属性用来保存所引用的员工对象
- 在映射文件中配置 set
修改类属性
private Integer id; private String name; private Set<Employee> employees = new HashSet<>(); //用来保存员工引用
修改映射文件
<!-- 配置一对多的关联 --> <set name="employees"> <!-- name 对应的属性名 就是集合的名字 --> <key column="dept"></key> <!-- 对应的是 employee表的外键字段名 --> <one-to-many class="com.ytzl.demo.entity.Employee"/> <!-- 关联的类 这里是 员工类 --> </set>
- name :属性名 ,集合属性的名字
- key元素:column 属性 设定与所关联的持久化类对应的表的外键,这里是employee表的dept外键字段名
- one-to-many :class属性指定关联的持久化类 这里对应的是员工类
cascade 属性 关联操作
用于指定如何操作与当前对象关联的其他对象
可选值:
- none :默认值 ;不关联其他的对象
- save-update 当通过Session执行
save(),update()及saveOrUpdate()方法的时候级联更新或者保存所关联的对象 - delete :当通过
session的delete()删除当前对象时,会级联 删除关联对象; - all :包含 delete,save-update的行为
inverse属性 反转属性
在hibernate中,'inverse'属性指定了关联关系中的方向。
关联关系中,'inverse=”false”‘的为主动方,由主动方负责维护关联关系。
order-by属性 指定集合内元素的排序顺序
这里以员工和部门为例,部门内的员工要以年龄倒序的顺序排序,就可以通过设置 order-by属性
order-by="age desc"
多对多关联
以 员工和项目为例,一个员工可以参与到多个项目中,每个项目有多个员工的参于
- 配置 Project类 ,在类中添加集合属性 用于保存员工引用
- 配置Employee类,在类中添加集合睡醒,用于保存项目引用
往往多对多映射涉及到第三张表
Project类
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>
- set元素的table属性 对应第三张关联表
- key元素的column属性 对应project表在第三张表的外键
- many-to-many 元素 column对应关联对象在第三张表的外键
Employee类
private Integer id; private String name; private Integer age; private Integer sex; private Dept dept; //引用所属的部门 private Set<Project> projects = new HashSet<>(); //保存项目引用
Employee映射文件
<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允许在对象-关系映射文件中配置加载策略
| 级别 | 说明 |
|---|---|
| 类级别 | |
| 一对多关联级别 | |
| 多对一关联级别 |
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# hibernate的关联映射
# hibernate
# 映射
# 映射关系
# 详解hibernate双向多对多关联映射XML与注解版
# Java的Hibernate框架中一对多的单向和双向关联映射
# 深入解析Java的Hibernate框架中的一对一关联映射
# 举例讲解Java的Hibernate框架中的多对一和一对多映射
# Hibernate一对多关联双向关联代码实现分享
# java Hibernate 一对多自身关联问题
# hibernate一对多关联映射学习小结
# 加载
# 为例
# 关联关系
# 类中
# 值为
# 可选
# 多个
# 第三张
# 的是
# 这就
# 级联
# 默认值
# 字段名
# 是有
# 两种
# 其他的
# 只会
# 这篇文章
# 要以
# 涉及到
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Thinkphp 中 distinct 的用法解析
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
如何在IIS7中新建站点?详细步骤解析
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
个人网站制作流程图片大全,个人网站如何注销?
如何在阿里云完成域名注册与建站?
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
Windows Hello人脸识别突然无法使用
如何将凡科建站内容保存为本地文件?
音响网站制作视频教程,隆霸音响官方网站?
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
如何用PHP快速搭建CMS系统?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
,在苏州找工作,上哪个网站比较好?
黑客入侵网站服务器的常见手法有哪些?
微信小程序 canvas开发实例及注意事项
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
免费视频制作网站,更新又快又好的免费电影网站?
常州企业网站制作公司,全国继续教育网怎么登录?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Android仿QQ列表左滑删除操作
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
Laravel如何使用Collections进行数据处理?(实用方法示例)
如何选择PHP开源工具快速搭建网站?
创业网站制作流程,创业网站可靠吗?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
Android 常见的图片加载框架详细介绍
如何在橙子建站中快速调整背景颜色?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
如何彻底删除建站之星生成的Banner?
微信小程序 require机制详解及实例代码
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
教学论文网站制作软件有哪些,写论文用什么软件
?
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
如何快速辨别茅台真假?关键步骤解析
Laravel Docker环境搭建教程_Laravel Sail使用指南
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?

