java - 如何在休眠中仅删除@OneToOne双向映射的一侧
问题描述
我在两个单独的实体中有两列
面试实体
@OneToOne(cascade=CascadeType.PERSIST, orphanRemoval = true)
@JoinColumn(name = "applicant_id", nullable=false)
private Applicant applicant_id;
申请实体
@OneToOne(mappedBy="applicant_id", cascade = CascadeType.ALL, orphanRemoval = true)
private Interview interview_id;
问题是,我如何正确映射它以便我只能运行service.deleteInterview();
和删除interview
实体记录?
如果我使用cascadeType.all
它会删除applicant
实体。我尝试将其更改为持续存在,然后我收到一个 500 错误,指出如果调用该函数,实体将被重新创建。
添加orphan removal=true
结束了这个异常org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null];
我正在考虑分配mappedBy
给interview
实体,但是,我不确定这是否是解决方案,而且我也有保留,因为我的interview
实体是在创建实体之后创建的applicant
。
解决方案
您应该只在父实体上使用cascade = ...
and (在您的情况下)。在关联的两侧使用级联没有意义(对于任何关系,不仅仅是一对一)。想想级联的作用,以及当你尝试创建一个新的. 表示实体需要创建一个如果面试对象被赋予一个申请人字段。一旦创建了申请者,它就会看到申请者实体有,这意味着它需要保留它拥有的任何字段,因此它会再次尝试创建一个,这没有意义,因为您已经创建了面试。orphanRemoval = ...
Applicant
Interview
CascadeType.PERSIST
Interview
Applicant
CascadeType.ALL
Interview
Interview
我猜测它为什么要删除Applicant
是因为你orphanRemoval
在双方都有。HibernateInterview
认为因为它有orphanRemoval
它是关联的父端,所以一旦你删除Interview
它就认为Applicant
不再需要它,因此也删除了该记录。
Hibernate 文档在这里说明了很多:
...只有关联的父方才有意义将其实体状态转换级联到子级。
浏览该指南中的一些示例,了解它们如何在OneToOne
关系中使用级联。
推荐阅读
- python - 无需中间事件调度即可更改多个 kivy 属性
- python - 如何使用 python-docx 从文档中提取标题编号?
- python - 如何有效地进行 rasa nlu、故事数据验证和更新?
- c - 检测运行时是否正在使用调试器
- kubernetes - 如何从 HA 集群和 etcd 集群中删除主节点
- python - 绘制按值分组的德莱尼三角剖分
- perl - 使用 `atom` 运行 perl 代码会抛出未定义的子例程 &main::send_request
- mysql - 具有限制冲突的光标分页
- python - sklearn 抛出 ValueError: bad input shape (600000, 24)
- swiftui - SwiftUI:onDelete 无法正确更新 UI