SSH学习(十二)Hibernate一对多关系映射

Hibernate一对多映射 Hibernate级联映射前言关联1、概念2、关联的分类注意要点级联映射总结 前言 今天为大家分享的是Hibernate的映射,主要讲的是一对多的映射, hibernate的其他知识点之前就有提及过,以下是博客链接: 1、hibernate的初步介绍与学习 2、hibernate的入门 关联 1、概念 关联指的是类之间的引用关系。 如果类A与类B关联,那么被引用的类B将被定义为类A的属性。 public class A{ private B b = new B; 阅读详情

搬砖工版权所有,如需转载请注明出处


Java基础专栏请戳这里http://blog.youkuaiyun.com/column/details/14176.html

博主SSH框架专栏请戳这里http://blog.youkuaiyun.com/column/details/14227.html

前面几篇文章分别讲述了Hibernate的基础知识、常见用法以及配置信息,未读过的同学可以点击链接到博主的专栏阅读

在前几篇博客,我们初步对hibernate有了一定的基础性的认知了,也能够简单的用hibernate进行增删改查,但hibernate真正的难度和精髓我们都还没接触到,其中最主要的关联映射就是其中一个,这篇博客,我们就一起来看一下这个hibernate关联映射。我们大家都知道,在域模型(实体域)中,关联关系是类与类之间最普遍的关系,他是指通过一个对象持有另一个对象的实例根据UML语言,关系是有方向的。实质上关联映射的本质:将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用。搞清关联映射的的关键就在于搞清实体之间的关系。下面我们首先来看一下具体什么事关联关系:

一、关联关系
1.关联关系的方向可分为单向关联和双向关联。
单向关联:假设存在两张表person表和address表,如果在应用的业务逻辑中,仅需要每个person实例能够查询得到其对应的Address实例,而Address实例并不需要查询得到其对应的person实例;或者反之。
双向关联:既需要每个person实例能够查询得到其对应的Address实例,Address实例也需要查询得到其对应的person实例。
2.关联的数量,根据拥有被关联对象的个数确定
多对一(many to one):如用户和组 学生和班级
一对多(one to many):如用户和电子邮件
多对多(many to many):如学生选课
一对一(one to one):如用户和身份证
下面我们就开始讲第一种关联关系:一对多,一对多总共分为:单向一对多,单向多对一,双向一对多。这主要是站在关系双方各自角度来定义的。下面我们就来一一来看一下
二、单向多对一
     单向多对一关联是最常见的单向关联关系,如:多个用户属于同一个组,多个学生处于同一个班级。之所以叫他多对一而不是一对多,是因为他们之间的关系是多的一方来维护的,下面我们就以多个用户属于同一个组来详细说明一下单向多对一。首先看一下他们的关系示例:

                            
从上边的图示中可以看出,多个用户属于一个组,我们用多的一方来维护,所以我们可以根据用户可以知道他在哪个组,而不需要知道一个组里有哪些学生,这就是所谓的单向的。多对一映射原理:在多的一端加入一个外键指向一的一端,它维护的关系多指向一,一对多映射原理,在多的一端加入一个外键指向一的一端,她维护的关系是一指向多,也就是说一对多与多对一的映射原理是一样的,只是站的角度不一样。下面来看一下单向多对一关系配置文件:
Group:一的一方,不需要维护关系,所以和普通配置一样

<hibernate-mapping>  
    <class name="cn.edu.bzu.manytoone.entity.Group" table=“group">  
        <id name="id">  
            <column name="id" />  
        </id>  
        <property name="name" type="java.lang.String">  
            <column name="name" length="50" not-null="true" />  
        </property>  
    </class>  
</hibernate-mapping>

User:多的一方,需要维护双方关系,内有一的一方引用:

<hibernate-mapping>  
    <class name="cn.edu.bzu.manytoone.entity.User" table=“user”>  
        <id name="id">  
            <column name="id" />  
            <generator class="native" />  
        </id>  
        <many-to-one name=“group” column =“group_id”/>  
        </many-to-one>  
        <property name="name" type="java.lang.String">  
            <column name="street_name" length="50" not-null="true" />  
        </property>  
    </class>  
</hibernate-mapping> 
注:

1.many-to-one 元素的常用属性:  

                                                      
具体的抓取数据策略会再以后详细讲解
2.重要属性 - cascade(级联)
级联的意思是指定两个对象之间的操作联动关系,对一个对象执行了操作之后,对其指定的级联对象也需要执行相同的操作
总共可以取值为:all、none、save-update、delete
all-代表在所有的情况下都执行级联操作
none-在所有情况下都不执行级联操作
save-update-在保存和更新的时候执行级联操作
delete-在删除的时候执行级联操作

三、单向一对多
      所谓单向一对多,就是实体之间的关系由“一” 的一端加载“多” 的一端,关系由“一”的一端来维护,在JavaBean中是在“一”的一端中持有“多”的一端的集合,Hibernate把这种关系反映到数据库的策略是在“多”的一端的表上加一个外键指向“一” 的一端的表的主键。比如Class(班级)和Student(学生)之间是一对多的关系。一个班级里面有很多的学生,站在班级的角度上来看就是一个班级对应多个学生。我们来看一下具体的关系图:

                                     
从图上我们可以看出,在一的一端含有一个多的引用的集合,我们可以根据班级找到它有哪些学生,而不能根据学生找到他对应的班级。在一的一端维护的缺点:
 * 如果将student表里的classesid设为非空,则无法保存;
 * 因为不是在student端维护数据,所以student端不知道学生是哪个班的
 * 需要发出多余的update语句来更新关系;
   下面我们就具体来看一下一对多中维护关系的“一”中是怎么样来配置的:Class映射文件

<hibernate-mapping>  
    <class name="cn.edu.bzu.hibernate.Class" table=“tb_class”>  
        <id name="id">  
            <generator class=“native"/>  
        </id>  
        <property name="name"/>  
        <set name="students" >  
			<key column="classid" ></key>  
			<one-to-many class=“cn.edu.bzu.hibernate.Student" />  
        </set>  
    </class>  
</hibernate-mapping> 
注意:
1.<set>元素的inverse属性:在映射一对多的双向关联时,应该在“one”方把inverse属性设为true,这样可提高应用性能。
inverse:控制反转,为true表示反转,由它方负责;反之,不反转,自己负责;如果不设,one和many两方都要负责控制,因此,会引发重复的sql语句以及重复添加数据,
2.级联删除(从数据库删除相关表记录)
 当删除Customer对象时,及联删除Order对象.只需将cascad属性设为delete即可.
注:删除后的对象,依然存在于内存中,只不过由持久化态变为临时态.
3.父子关系(逻辑删除,只是解除了关联关系)
 自动删除不再和Customer对象关联的Order对象.只需将cascade属性设为delete-orphan.
注:当关联双方都存在父子关系,就可以把父方的cascade属性设为delete-orphan,所谓父子关系,是由父方来控制子方的生命周期.
4.<set name="students" >
         <key column="classid" ></key>
         <one-to-many class=“cn.edu.bzu.hibernate.Student" />
   </set>
Name为--持久化对象的集合的属性名称
<key column="classid" ></key>外键的名称
<one-to-many class=“cn.edu.bzu.hibernate.Student" />持久化类

四、双向一对多关联
      所谓双向一对多关联,同时配置单向一对多和单向多对一就成了双向一对多关联,上面两种都是单向的,但是在实际开发过程中,很多时候都是需要双向关联的,它在解决单向一对多维护关系的过程中存在的缺陷起了一定的修补作用。在插入学生的时候,如果班级不能为空,则学生是插入不了的。还有如果插入成功,在开始解决班级字段是空的,在事务提交阶段,班级需要更新每一个学生的班级ID,这样会产生大量的Update语句。影响效率。所以一对多关系大多使用双向一对多映射。具体配置文件:
多的一方:Student映射文件

<hibernate-mapping>  
    <class name="cn.edu.bzu.hibernate.Student">  
        <id name="id">  
            <generator class=“native"/>  
        </id>  
        <property name="name"/>  
        <many-to-one name=“classes” column=“classid”/>  
</class>
</hibernate-mapping>
一的一方:Class映射文件

<hibernate-mapping>  
    <class name="cn.edu.bzu.hibernate.Class" table=“tb_class”>  
        <id name="id">  
            <generator class=“native"/>  
        </id>  
        <property name="name"/>  
        <set name="students">  
        <key column="classid" ></key>  
        <one-to-many class=“cn.edu.bzu.hibernate.Student" />  
        </set>  
    </class>  
</hibernate-mapping>  
注:
1.一对多双向关联映:
 * 在一的一端的集合上使用<key>,在对方表中加入一个外键指向一的一端;
 * 在多一端采用<many-to-one>
2.key标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段错误;
3.如果在一的一端维护一对多关联关系,hibernate会发出多余的Update语句,多以我们一般在多的一端维护关联关系
4.关于inverse属性;
 inverse主要用在一对多,多对对双向关联上,inverse可以设置到<set>集合上,
 默认inverse为false,所以我们可以从一的一端和多的一端来维护关联关系,如果inverse为true,我们只能从多的一端来维护关联关系,注意:inverse属性,只影响存储(使存储方向转变),即持久,
5.区分inverse和cascade
Inverse:负责控制关系,默认为false,也就是关系的两端都能控制,但这样会造成一些问题,更新的时候会因为两端都控制关系,于是重复更新。一般来说有一端要设为true。
Cascade:负责控制关联对象的级联操作,包括更新、删除等,也就是说对一个对象进行更新、删除时,其它对象也受影响,比如我删除一个对象,那么跟它是多对一关系的对象也全部被删除。
举例说明区别:删除“一”那一端一个对象O的时候,如果“多”的那一端的Inverse设为true,则把“多”的那一端所有与O相关联的对象外键清空;如果“多”的那一端的Cascade设为Delete,则把“多”的那一端所有与O相关联的对象全部删除。

SSH框架之Hibernate的关联映射之一对多、多对一映射 关联映射之一对多、多对一映射 一、需求: 部门与员工 一个部门有多个员工 【一对多】 多个员工,属于一个部门 【多对一】 二、逻辑分析: 三、代码实现 1、javabean及映射文件的配置: 1)Employee.java、Employee.hbm.xml 2)Dept.java、Dept.hbm.xml 阅读详情

相关推荐

Hibernate旅程(五)Hibernate映射--基本类映射和对象关系映射

回想一些我们在没有学习ssh的时候,我们建立数据库的表时,首先是数据库建模E-R图,然后再通过实体模型来建立关系模型,再建立相应的表。实体间存在三种关系,一对一,一对多(或者说多对一),多对多。而如今我们要根据类来映射相应的表,那只能是通过类与类之间的关系加上映射文件来映射数据库的表。我们学习UML建模,类与类之间存在五种关系,继承,实现,关联,依赖,聚合/组合,在hibernate中实体类之间的

Xinghf 1万+

一对多关系映射

一.实体一对多关联 二.数据库表体现一对多关联 在关系模型中,只存在外键参照关系,而且是 many 方参照 one 方。 三.Hibernate单向一对多关联 在 User 中定义一个 Order 的引用集合,而在 Order 中无需作任何定义。 (1)映射配置文件 在 User.hbm.xml 文件中使用 元素配置。 元素属性: – name属性:指定要映射的属性名; – ca...

weixin_44819924的博客 344

【SSH进阶之路】Hibernate映射——一对多关联映射(七)

一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。关联关系都是由多端维护,一端维护多端的关系,在加载一端时,可以将多端加载上来。

努力+坚持,而且还很年轻 1万+

Hibernate一对多的关联映射,详解(代码+图解)与应用 举个栗子,搞的清楚

在开头跟大家分享的时候我就说,面试我是没有做好准备的,全靠平时的积累,确实有点临时抱佛脚了,以至于我自己还是挺懊恼的。(准备好了或许可以拿个40k,没做准备只有30k+,你们懂那种感觉吗)如何准备面试?1、前期铺垫(技术沉积)程序员面试其实是对于技术的一次摸底考试,你的技术牛逼,那你就是大爷。大厂对于技术的要求主要体现在:基础,原理,深入研究源码,广度,实战五个方面,也只有将原理理论结合实战才能把技术点吃透。

2401_84409344的博客 1193

【SSH进阶之路】Hibernate映射——一对一单向关联映射(五)

两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应。例如:一个人(Person)只有一张身份证(IdCard)。

努力+坚持,而且还很年轻 2万+

【MyBatis】映射一对多和多对多关系配置(看完这篇不吃亏)

resultMap 允许我们定义复杂的映射规则,将结果集中的多个字段映射到一个对象中。因为我们是一对多的所以我们再编写vo类的时候,里面是使用list集合。建立我们给的sql文件,运行它用这里面的表,让我们更好的示例操作。在我们的配置文件里面配置我们需要的几个表,自动生成所需文件。当然我们要先建立这个包里面的类才能更好的下一步。在原本的基础的sql上我们增加一个一对多的sql。在上面我们已经写好了sql,我们生成对应的。在我们的里面添加一个sql的方法编写。在生成的接口类里面编写对应的接口方法。

无法自律的人的博客 5964

7.一对多的关联映射

1.一对多的单向关联 类图: 表关系:   1.创建model对象 多的一端 public class Emp { private Integer empNo; private String ename; private Date birthday; private Integer gender; private String address; ...

zhangyan的博客 293

SSH一对多(两表双向关联查询)

SSH一对多(两表双向关联查询:person表、organisation‘组织'表) 数据库:Mysql 里面有现成的测试方法,直接在java中就可以看到效果

SSH框架之Hibernate一对多关系数据绑值修改删除出现问题

1.数 据 绑 值 在hibernate一对多关系中,多的一方直接绑会出现的问题。原因是彼此都有关系,然后会出现反复去拿取值,然后就绑不上出现空。首先在取值时把有关系的set null 如下图 现在出现的问题是不能重复绑职位取值是只会拿一次 可以用SerializerFeature.DisableCircularReferenceDetect 关闭引用检测

qq_40273898的博客 1651

hibernate(一对多,多对一映射)操作

hibernate基于 一对多、多对一映射写的一个增加,查询,删除,修改的demo,内附数据库脚本

从IR Drop到EM分析:数字IC电源规划中那些没人明说的细节(以MTCMOS配置为例)

本文深入探讨数字IC后端设计中电源规划的关键细节,特别关注MTCMOS配置、电源网络电阻最小化和level shifter供电等实战技巧。通过分析IR Drop和EM问题,提供优化floorplan和powerplan的具体策略,帮助工程师避免常见陷阱,提升芯片设计的稳定性和可靠性。

q9w8e7r6t5的博客 511

hibernate 一对多关系配置(学习一)

上上篇博文【SSH进阶之路】Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息。       上篇博文【SSH进阶之路】Hibernate映射——一对一双向关联映射(六),双向关联映射解决了单向关联映射只能从一端加载信息的缺陷,当然,双向关联映射并不影响存

290

图相似度模型(论文篇)

图相似度模型

weixin_43702653的博客 5747

SSH框架---Hibernate中的一对多关系映射与多对多关系映射(七)

前提:表数据和表数据之间可以存在的关系?1、一对多(最多) 建表原则:在多的一方创建一个字段当成是外键2、多对多 建表原则:创建一张中间表,这个中间表中至少需要2个字段,分别指向各自表的主键3、一对一(企业开发中很少,其实就是合成一张表来使用)引申到,实体类和实体类之间可以存在的关系?1、一对多 创建原则:在一中创建多的集合;在多中创建一的的对象2、多对多 创建原则:互相都有...

qq_37358143的博客 508

别再乱改宏定义了!STM32F103程序移植保姆级教程(从C8T6到ZET6实战)

本文详细解析了STM32F103程序从C8T6移植到ZET6的实战步骤,重点介绍了硬件差异、开发环境配置、时钟陷阱及外设处理等关键点。通过修改宏定义(如STM32F10X_HD)、调整启动文件和时钟配置,确保移植顺利进行。适合嵌入式开发者参考,避免常见移植问题。

weixin_42567497的博客 215

机器人中的数值优化(十二)——带约束优化问题简介、LP线性规划

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 3850

SSH之Hibernate(三)关系映射

Hibernate中关系映射指的是实体类与实体类间的关系。和数据库中表与表之间的关系类似,有一对一,多对一,一对多,多对多四种映射关系。

kesteler的博客 1041

Algorithm:【算法进阶之路】之算法面试刷题集合—数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构【元素/关系】、数据运算【十大排序/四大查找-图三大搜索-

​ Algorithm:【算法进阶之路】之算法面试刷题集合—数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构【元素/关系】、数据运算【十大排序/四大查找-图三大搜索-树三大遍历】、高级算法【枚举/回溯/递归/分治/动规/贪心】)、问题为导向的十大类刷题算法总结之详细攻略 目录 相关文章 数据结构思维导图 基本术语 一、数据结构的概述 二、数据的逻辑结构 三、数据的物理结构 四、数据的运算

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 6849

【SSH系列】Hibernate映射 一对多关联映射

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&

gfjjggg的博客 272

MacBook 长期挂机 OpenClaw:电池保护 + 防休眠设置

本文介绍了MacBook长期挂机运行OpenClaw时的电池保护和防休眠设置方案。主要内容包括:1)电池保护策略,通过电源连接、充电限制和定期充放电维护电池健康;2)防休眠设置,禁用系统休眠、自动休眠和屏幕休眠;3)OpenClaw的Docker部署方法。文章提供了详细的命令行脚本和配置说明,帮助用户实现MacBook的长期稳定运行,同时保护电池寿命。

一键难忘的博客 1693

思远耳机充电芯片-SY5501

BES2700ZP-本文档介绍了思远耳机充电芯片SY5501的使用方法,包括芯片引脚功能说明(VCC、IRQ、RST等)、通信机制(VIN引脚的双重作用)以及相关注意事项。提供了代码片段、调试日志和电路图作为参考,并列出了待解决的问题清单。该芯片需要配合特定充电仓使用,支持私有协议和用户自定义通信功能。

云淡风轻 123

hibernate 注解配置一对多关系

hibernate 注解配置一对多关系 //转:http://hi.baidu.com/tm_98396/blog/item/2fa3e5c1b06515b78226ac9a.html  从Hibernate 2.5开始就可以使用annotation实现实体关系的映射了,减少了配置hbm文件的繁琐,而且annotation也是一种趋势,现在的SSH2的整合都是完全可以用

yiluoAK_47的专栏 1851

ASPICE(Automotive SPICE)流程落地,研发管理工具自研,如何从量化数据体现研发效率提升的

摘要: ASPICE流程显著提升研发效率,主要体现在质量、成本和时间三个维度。关键量化指标包括:缺陷率降低30%-60%,维护工作量减少28%,研发周期缩短10%-20%,需求变更率降低58%,代码评审效率提升300%。初期开发成本虽增加9%,但长期回报率高。核心方法包括缺陷预防前移、需求精准管理和流程标准化与自动化。建立量化度量体系需覆盖缺陷密度、需求稳定性、进度偏差等指标,并依托工具链支持数据收集。实施ASPICE是短期投入换取长期质量提升和成本优化的高效投资。

汽车软件开发 182

【SSH系列】Hibernate映射 -- 一对多关联映射

【SSH系列】Hibernate映射 -- 一对多关联映射

qq_43682716的博客 167

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【Hibernate框架】关联映射(一对一关联映射)

关于一对一映射的相关知识告一段落,但是大家要知道,唯一外键关联其实就是多对一关联的一种特殊情况,所以当我们需求变了,要求有一对一变成多对一的时候,我们该怎么办呢?其实很简单,直接把外键唯一的约束干掉就可以了,是不是方便很多呢

Davie's Happy Life 813

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: SSH学习(十一)Hibernate常用配置文件详解
下一篇: 为什么你该开始学习编程了?
海之沐
博客等级 码龄12年 1536粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值