再谈Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN

k8s部署 普罗米修斯(Prometheus)监控 Prometheus是一个开源的服务监控系统和时序数据库其提供了通用的数据模型和快捷数据采集、存储和查询接口它的核心组件Prometheus服务器定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉 取数据新拉取到啊的 数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。 阅读详情

声明:
1、本文系原创,非抄袭或转载过来的。
2、本文论点都亲手做过实验论证。
3、本文所讲的Hibernate配置都基于注解的方式,hbm语法未提供。
很多人对持久层概念搞不清JPA、Hibernate、EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和Hibernate是具体的实现类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的SessionAttribute跟Session Bean近似)。
理论是使用JPA接口可以无缝切换持久层实现,但是仅仅是理论上!!!


JPA是在Hibernate成熟并大行其道的时候才推出的,基本上是借鉴Hibernate的优点,做了一个统一的标准而已,JPA1.0没有一对多的级联删除配置,也许JPA2.0里才有吧(这里没做过调研)
@OneToMany(mappedBy = "commentTeam")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<CommentTeamMember> commentTeamMembers;
这里为了说明,只贴出一对多的关键代码,其它无关的注解已忽略掉,以免造成干扰。
这里重点说明一下四个常用的注解配置的区别:
CascadeType.SAVE_UPDATE
CascadeType.ALL
CascadeType.DELETE
CascadeType.DELETE_ORPHAN


 之所有之列出这四个,是因为我不想跟书本上把所有的概念都罗列出来。基本上开发时其中的3个都以及足够用了,下面我结合代码演示一下他们之间的区别,以及使用的时候注意的地方。
CascadeType.SAVE_UPDATE:Hibernate专有的,JPA并不支持,作用是级联保存、级联更新(注:JPA很恶心,要么你配置
CascadeType.ALL,要么你配CascadeType.SAVE+CasadeType.Merge。八卦一句:专家虽牛,多年不写代码,定的标准让编码麻烦呀!)
CascadeType.ALL:级联保存、修改、删除、同步,一般很少用,看看控制台的一长串SQL就知道性能低下,你没改的关联表也给你发update语句,我从来没用过这个属性。
CascadeType.DELETE:当调用session.delete(A)的时候,级联删除关联的对象。(注:先调用A.setB(null),再调用session.delete(A),这样是级联删不掉B的。
CascadeType.DELETE_ORPHAN:一对多级联删除。


下面重点来说说这个CascadeType.DELETE_ORPHAN:
看过API、开发指南,级联删除就一个经典的
@OneToMany(mappedBy = "commentTeam")
@Cascade({CascadeType.SAVE_UPDATE,CascadeType.DELETE_ORPHAN})
private Set<CommentTeamMember> commentTeamMembers;


mappedBy不可少,映射A->B一对多的另一边控制反转(谁控谁的问题),新版的Hibernate3.4中配置更简单,变一句了,更简洁吧?
@OneToMany(mappedBy = "commentTeam",orphanRemoval=true) 
private Set<CommentTeamMember> commentTeamMembers;


以上两种配置方式是等价的,下面是在实际开发中的使用了,有些时候代码方面不注意,会误以为明明配置正确了,但为什么不起作用呢? 下面例举一下代码,请看Action代码(实际上我在Spring Controller里,N年不写DAO了,Service很少用,Manager一边去!)
CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
commentTeam.setCommentTeamMember(null);//想级联删除子表数据
this.getHibernateTemplate.saveOrUpdate(commentTeam);
这样级联删除却没有发生?为什么呢?
再来一个例子
CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
Set<CommentTeamMember> commentTeamMembers=new HashSet<CommentTeamMember>();
commentTeam.setCommentTeamMember(commentTeamMembers);//想级联删除子表数据或增减替换对象
this.getHibernateTemplate.saveOrUpdate(commentTeam);
这个例子级联删除的效果也没发生!即使commentTeamMembers理由有若干个对象。


成功执行级联删除的语法:
CommentTeam commentTeam=this.getHibernateTemplate.get(CommentTeam.class,id);
commentTeam.getCommentTeamMember().clear();//注意这里引用的集合还是原理的集合,这里没有重新new过
commentTeam.getCommentTeamMember().add(new CommentTeamMember());//如果想替换为新的集合可以用addAll方法
this.getHibernateTemplate.saveOrUpdate(commentTeam);

分析一下原因:级联删除起作用的前提是关联的集合对象不能重新指向新的引用,必须在原有的集合里操作新增、删除、清空元素,像上面的setXXX(null)的方法等是起步到级联删除作用的,大概是Hibernate自认自己原生的集合对象吧,自己New的放进行级联删除无效!



































































































        
【数字孪生工业应用实战】第2篇:数字孪生系统架构设计与技术选型——从“作秀”到“实干”的骨架构建 本文系统剖析了数字孪生系统从“作秀”到“实干”的架构设计关键。针对多数项目在POC转生产时因架构混乱、选型盲目而失败的问题,深入阐述了四层分层架构(感知层、传输层、模型层、应用层)的设计原则,重点解析了感知层的异构适配与边缘预处理、传输层的异步解耦与多模式通信等工程细节。结合OPC UA、MQTT、EdgeX Foundry等主流技术选型对比,以及汽车焊装车间边缘智能网关的实战代码,提供了从零搭建微型孪生系统的完整指导。旨在帮助工程师建立清晰的选型决策逻辑,构建稳定、可演进的数字孪生“骨架”。 阅读详情

相关推荐

企业微信API实战:解密external_userid的跨应用一致性管理

本文深入探讨企业微信API中external_userid的跨应用一致性管理问题,解析其本质及在不同应用场景下的ID不一致挑战。通过ID转换与统一管理方案,结合unionid实现跨应用客户数据整合,提供实战代码示例和架构设计,助力企业构建高效的客户管理系统。

weixin_29258297的博客 637

Hibernate all-delete-orphan[转]

当关联双方存在父子关系,就可以在 set 处设定 cascade 为 all-delete-orphan 所谓父子关系,即指由父方控制子方的持久化圣明周期,子方对象必须和一个父方对象关联。如果删除父方对象,应该级联删除所有关联的子方对象;如果一个子方对象不再和一个父方对象关联,应该把这个子方对象删除。 all-deleteorphan 的能力: 1. 当保存或更新父方对象时,级联保存或...

Just Do It 291

Office 365部分安装及同时安装Visio的方法

From MWeb Win版本的Office 365安装包默认安装所有组件,没有选择的页面,在安装Office 365后再安装下载的Visio 2016专业版时,会显示计算机上已经安装了即插即用Office,Visio不可安装,因此可以考虑使用Office部署工具来解决这两个问题。 下载安装Office365和Visio 下载Office部署工具 修改配置 部署工具使用方法...

weixin_30737363的博客 2万+

Spring Data JPA OneToMany注解参数orphanRemoval,一对多删除详解

回顾 上篇文章分析了OneToMany级联操作多方的插入、更新、删除。我们得到如下结论: 1、插入,建议一方设置mappedBy,好处是只会执行一条insert语句。不会执行多余的update外键的sql。 2、更新,没有区别 3、删除,一方设置mappedBy。一方维护的多方集合remove,多方显示删除。 orphanRemoval 插入和更新都没有什么问题。但是删除就有些奇...

稀有气体的技术博客 1万+

【项目立项管理、项目整合管理】30天通过软考高项-第二天

①项目或阶段的概述;②范围目标、范围的评估标准,证明达到完⼯标准的证据;③质量目标、项目和产品质量的评估标准、相关核实信息和实际里程碑交付日期以及偏差原因;④成本目标,包括可接受的成本区间、实际成本,产⽣任何偏差的原因等;⑤最终产品、服务或成果的确认信息的总结;⑥进度计划目标,包括成果是否实现项目预期效益:如果在项目结束时未能实现效益,则指出效益实现程度并预计未来实现情况;

weixin_42520723的博客 1000

MBIST --- PATR1.Memorybist测试原理

mem bist作为现在design设计中不可或缺的DFT设计内容,越发重要。本章节主要介绍mem bist组成部分,测试的原理以及注意事项。

sinat_27691203的博客 1万+

谈论Hibernate级联删除——JPA根据Hibernate实现许多级联删除CascadeType.DELETE_ORPHAN

声明: 1、这篇文章是原创。非复制或转载过来。 2、在本文中,参数都亲自做过实验证明。 3、这篇文章谈到了Hibernate配置基于注释的方法。hbm语法不可用。 不清JPA、Hibernate、EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口。EJB3.0和Hibernate是详细的实现类。EJB3.0和Hibernate的功能近似相等的(Hibernat...

weixin_33725515的博客 161

微信群“智”变:扣子机器人无缝接入实战

本文介绍了如何将扣子(Coze)机器人接入微信群实现智能化管理。文章首先阐述了扣子机器人的自然语言处理、自动分类和多模态交互等功能特点,以及其深度学习模型和持续学习能力的技术优势。随后详细讲解了接入步骤:从微信公众号配置、扣子平台机器人创建,到使用Flask框架实现消息转发功能的关键代码。通过电商客服和技术社群两个实际案例,展示了扣子机器人在提升响应效率、优化社群运营方面的显著效果。最后展望了未来在智能推荐、多模态交互等领域的发展潜力,为微信群智能化管理提供了实用解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 831

hibernate cascade="all-delete-orphan"(所有-删除-孤儿)释疑

这是一个级联插入,删除,更新的操作。 cascade="all-delete-orphan"(所有-删除-孤儿)。级联操作的精确语义在下面列出: 如果父对象被保存,所有的子对象会被传递到saveOrUpdate()方法去执行 如果父对象被传递到update()或者saveOrUpdate(),所有的子对象会被传递到saveOrUpdate()方法去执行 如果一个临时的子对象被一个持久化的...

lchina1314的专栏 553

我的AI个人公司成立:基于Skills与Qwen大模型的智能问答平台实战开发+龙虾团队

微学AI推出数字员工矩阵,包含10个核心AI角色(总经理、秘书、工程师等),每个角色具备专属技能模块。系统采用FastAPI+Vue3技术栈,核心功能包括:基于SkillLoader的动态技能管理(支持脚本执行和文档加载)、WebSocket流式输出、多轮对话上下文管理。通过模块化架构实现AI自驱协作,可自主完成从需求分析到开发落地的全流程。项目亮点在于声明式技能配置和实时交互能力,打破传统办公壁垒,提升工作效率。

微学AI的博客 1625

【2026华为OD新规机考】最新套题持续更新【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】

可上练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【优快云】否则不通过)

weixin_48157259的博客 508

有关Hibernate的级联删除

 举例:主表A 与子表B 如果现在要删除表A,那么可以在表B的hbm.xml文件里添加属性:cascade="all"或cascade="delete",这样系统就会在删除表A的同时,删除表B。如果以上的方法不行,就需要在表B的hbm.xml文件里添加另一个属性:inverse="true",表明表B是被动方,它与表A的关系将由表A来维护,因此系统在删除表A之前,会先删除与之相关的表B。

*童稚的心* 1340

对CryptoDriver里密钥格式定义的探索(1)

一入网络安全才发现深似海,传统汽车MCU码农转型之路异常艰难。在CP AUTOSAR中的CryptoDriver SWS对密钥格式的需求来源于RFC,其中要求了RSA、ECC、SHE等key material的格式。再往下看,我就有些迷糊了,例如关于RSA Private Key的OCTEE STRING格式根据IETF RFC8017,Public Key又得根据RFC5280,完全不得其解。所以今天先从生成密钥对,并对其进行解析开始,一步一步拆解。

认真搞搞汽车MCU 527

再谈Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN...

声明: 1、本文系原创,非抄袭或转载过来的。 2、本文论点都亲手做过实验论证。 3、本文所讲的Hibernate配置都基于注解的方式,hbm语法未提供。 非常多人对持久层概念搞不清JPA、Hibernate、EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和Hibernate是详细的实现类,EJB3.0和Hibernate的功能近似相等的(Hi...

weixin_34130389的博客 134

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

再谈Hibernate级联删除——JPA下的Hibernate实现一对多级联删除

JPA是在Hibernate成熟并大行其道的时候才推出的,基本上是借鉴Hibernate的优点,做了一个统一的标准而已,JPA1.0没有一对多的级联删除配置,也许JPA2.0里才有吧(这里没做过调研)@OneToMany(mappedBy = "commentTeam")@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,org....

jwfdpfangdongping的专栏 178

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN

看到一篇好文,转载下: 本文所讲的Hibernate配置都基于注解的方式,hbm语法未提供。 很多人对持久层概念搞不清JPA、Hibernate、EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和Hibernate是具体的实现类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的Sessi

kakolukiya的博客 1534

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN基于注解方式

很多人对持久层概念搞不清JPA、Hibernate、EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和Hibernate是具体的实现类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的SessionAttribute跟Session Bean近似)。 理论是使用JPA接口可以无缝切换持久层

一个大龄码农的专栏 1673

Hibernate的cascade属性 特别是 cascadeType.all的 作用

1.JPA中的CascadeType.ALL并不等于{CascadeType.PESIST,CascadeType.REMOVE,CascadeType.MERGE,CascadeType.REFRESH} 在Hibernate中调用session.save() or session.update()并不能触发 {CascadeType.PESIST,CascadeType.REMOVE,Casc...

美好的未来在于把握今天 1585

记一次 JPA @onetomany单向级联删除的操作

Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN  现在这个已经被弃用了,换成onetomany(orphanRemoval=true)了, 实现级联保存增加@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})

zerozone100523的专栏 3522

Hibernate的cascade属性 特别是 cascadeType all的 作用

Hibernate的cascade属性 特别是 cascadeType all的 作用

qq_43685201的博客 218

Hibernate的cascade属性 特别是 cascadeType.all的 作用

1.JPA中的CascadeType.ALL并不等于{CascadeType.PESIST,CascadeType.REMOVE,CascadeType.MERGE,CascadeType.REFRESH}   在Hibernate中调用session.save() or session.update()并不能触发 {CascadeType.PESIST,CascadeType.REM

z69183787的专栏 6万+

Hibernate级联删除——JPA下的Hibernate实现一对多级联删除CascadeType.DELETE_ORPHAN基于注解方式...

很多人对持久层概念搞不清JPA、Hibernate、EJB3.0的关系,这里做一下简单的说明:JPA是一个持久层设计接口,EJB3.0和Hibernate是具体的实现类,EJB3.0和Hibernate的功能近似相等的(Hibernate没有Session Bean,Spring MVC3的SessionAttribute跟Session Bean近似)。 理论是使用JPA接口可以无缝切换持久层...

一个大龄码农的专栏 212

Hibernate的cascade属性 cascadeType.all的作用

牛逼的人在干牛逼的事之前总有一段苦逼的岁月,只要像傻逼一样坚持,终究也会牛逼 1.JPA中的CascadeType.ALL并不等于{CascadeType.PESIST,CascadeType.REMOVE,CascadeType.MERGE,CascadeType.REFRESH}   在hibernate中调用session.save() or session

程序员 6087

hibernate cascade属性 all-delete-orphan

hibernate cascade属性 all-delete-orphan 分类: Java EE 2012-02-19 18:31 1920人阅读 评论(1) 收藏 举报 hibernatejpaimportdeleteclassjava 当关联双方存在父子关系,就可以在 set 处设定 cascade 为 all-delete-orphan 所谓父子关系,即指

人生最遗憾的莫过于:轻易地放弃了不该放弃的,固执地坚持了不该坚持的 1438
上一篇: OpenGL编程指南之glPolygonStipple函数深入理解
下一篇: Web开发中的三种缓存模式对页面访问速度影响和分析
西兹兹
博客等级 码龄22年 21粉丝 34原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值