用例是这样的:
现在有A、B两个对象,彼此关系是 A 1 : n B
换言之,A之中就有一个集合引用了B,现在我想通过调用 A.removeB(B b)方法,Hibernate就能透明的把B从数据库中删除掉,这样做的好处主要在于在“充血模型”中,领域对象有聚合根,所有对领域对象的操作必须由聚合根发起,上面的例子中,A是B的聚合根,因此需要删除B,则必须通过A发起。应用层的代码如下:
public class SomeService {
public removeBFromA(Long bId,Long aId) {
B b = bDao.get(bId);
A a = aDao.get(aId);
a.removeB(b);
}
我通过Hibernate设置了A、B的一对多关系,通过“mappedby”设置了B为主动方(主要是考虑插入数据的时候,不需要对B的外键调用多一次Update语句),casdaceType是ALL,但我发现,当删除A的时候,确实可以级联删除B,但当调用A.remove(B)的时候,只能把B的外键清空,并没有把B删除掉,而如果我尝试把B的外键的nullable设置为false,在调用b.setA(null)的时候,还会出现数据完整性异常,所以,根本无法通过A来发起对B的删除操作。(除非把B的DAO放置到A中,由A.removeB()方法显式调用DAO的方法删除B,但这就把持久化逻辑加入到领域对象中了,而持久化逻辑应该完全由应用层Servcie完成)。
于是,最终不得不把上面的代码改为:
public class SomeService {
public removeBFromA(Long bId,Long aId) {
B b = bDao.get(bId);
A a = aDao.get(aId);
a.removeB(b);
bDao.remove(b); // 领域层的客户代码必须显式的删除B
}
上面的代码表面上没问题,但事实上,应用层必须显式的去删除B,这样做就不太优雅了,因为领域层把A管理B生命周期的细节泄漏到应用层了。
不知大家有没有什么好的办法解决这个问题。
分享到:
相关推荐
### Hibernate基础之关联映射与级联操作 ...以上是关于Hibernate中关联映射和级联操作的基础知识概述,掌握了这些内容后,开发者能够在实际项目中更加灵活高效地使用Hibernate进行数据持久化操作。
MyBatis是一个优秀的持久层框架...总之,MyBatis的关联和级联特性使得对象关系映射更加自然,动态SQL则让数据库操作变得更加灵活和高效。理解并熟练运用这些功能,将极大地提升你在处理数据库交互时的效率和代码质量。
在Java Persistence API (JPA) 中,一对...总的来说,JPA的一对多双向关联及级联操作为开发者提供了便利,但也需要注意合理配置以避免潜在的问题。在实际开发中,我们需要根据业务需求和性能考虑来选择合适的关联策略。
然而,自关联表的级联删除并不像简单的外键级联删除那样直接,因为它涉及到了递归关系。 在上述标题和描述中提到的MS Server自关联表的级联删除,主要通过触发器来实现。触发器是一种特殊的存储过程,它会在特定的...
"级联H桥SVG高频阻抗模型研究与应用",级联H桥svg高频阻抗模型 ,级联H桥; SVG; 高频阻抗; 模型;,高频阻抗模型:级联H桥SVG研究
高频阻抗模型:级联H桥SVG的深入解析,级联H桥SVG高频阻抗模型的研究与应用,级联H桥svg高频阻抗模型 ,级联H桥; SVG; 高频阻抗; 模型,高频阻抗模型:级联H桥SVG研究
这些模型可以直接应用于OpenCV的`cv2.CascadeClassifier()`函数,进行物体检测,如人脸识别、行人检测或其他自定义的目标检测任务。 使用这些模型的基本步骤如下: 1. 解压文件,获取`.xml`模型文件。 2. 在Python...
融合优化与闭环PI控制策略探究,Boost与LLC级联型直流变换器仿真模型:优化非隔离与电压范围特性,采用输出电压闭环PI控制,Matlab/Simulink实现,Boost+LLC级联型直流变器仿真模型。 弥补boost变器非隔离特性以及LLC...
本资料包"10_JPA详解_JPA中的一对多双向关联与级联操作.zip"聚焦于JPA中的一个重要概念——一对多双向关联及其级联操作。以下是对这一主题的详细阐述。 **一对多关联** 在关系数据库设计中,一对多关联是最常见的...
在实际应用中,需要注意的是,虽然双向关联和级联操作带来了很多便利,但也可能导致性能问题,因为它们会增加数据库查询的复杂性和数据的冗余。因此,在设计数据模型时,应权衡易用性和效率,合理使用这些特性。 本...
Boost+LLC级联型直流变换器仿真模型:突破非隔离与电压范围限制,实现精准输出电压闭环PI控制,基于Matlab Simulink平台,Boost+LLC级联型直流变器仿真模型。 弥补boost变器非隔离特性以及LLC谐振变器电压范围窄的...
级联删除(Cascade Delete)就是其中之一,当删除一个对象时,会根据配置自动删除与之相关联的对象。在文档中提到的场景下,我们来详细探讨Hibernate级联删除的原理和配置方法。 首先,我们要理解关系映射中的几个...
在数据库管理中,级联删除是一种常见的功能,它允许在删除一个表中的记录时,自动删除与之相关联的其他表中的记录。在Qt环境下,结合SQLite3数据库,我们可以实现这一功能。Qt是一个跨平台的C++库,提供了丰富的GUI...
当调用`session.delete(student)`或`session.delete(course)`时,如果配置了级联删除,Hibernate会检查关联表,找出所有与被删除实体关联的记录,并一并删除。请注意,级联删除可能引起数据丢失,因此在使用时需谨慎...
通过研究发现,时钟偏移问题是 SN74HC595 级联应用中的一个关键问题。时钟偏移会导致 SN74HC595 的输出出错,影响系统的稳定性和可靠性。 在了解 SN74HC595 的基本知识后,我们可以更好地理解时钟偏移问题的产生...
三相级联H桥七电平、十一电平逆变器仿真模型:载波移相与层叠控制方法研究参考文献,三相级联H桥逆变器仿真模型,七电平,十一电平逆变器,采用载波移相或者载波层叠的控制方法,可以提供参考文献 ,三相级联H桥逆变器...
OBC两级式车载电源Buck+LLC级联直流变换器电路模型:双闭环控制下的输出电压与电感电流优化及Matlab Simulink仿真探究,OBC两级式车载电源 Buck+LLC级联型直流变器电路模型 采用双闭环控制 输出电压+电感电流双环,比...
三相级联H桥七电平、十一电平逆变器仿真模型:载波移相与层叠控制方法参考文献研究,三相级联H桥七电平、十一电平逆变器仿真模型:载波移相与层叠控制方法参考文献研究,三相级联H桥逆变器仿真模型,七电平,十一电平...
"MySQL 中利用外键实现级联删除、更新" 在 MySQL 中,外键是指在一个表中的一列或多列,引用另一个表中的主键或唯一索引。外键可以强制实施数据的一致性和完整性,使得数据更加可靠。外键在 MySQL 中的实现主要是...