我在两个单独的实体中有两列
采访实体
@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
实体。
答案 0 :(得分:2)
您应仅在 parent 实体(在您的情况下为renderComponent: CustomRenderComponent
)上使用ng2-smart-table
和cascade = ...
。在关联的两端都使用级联是没有意义的(对于任何关系,不仅是一对一的关系)。考虑级联的作用,以及当您尝试创建新的orphanRemoval = ...
时会发生什么。 Applicant
说,Interview
实体需要创建CascadeType.PERSIST
,如果面试对象被赋予了申请人字段。创建申请人后,它会看到申请人实体具有Interview
,这意味着它需要保留其拥有的任何Applicant
字段,因此它将再次尝试创建CascadeType.ALL
,因为您已经创建了采访,所以这没有任何意义。
我之所以会删除Interview
是因为您两边都有Interview
。 Hibernate查看Applicant
并认为,因为它有orphanRemoval
是关联的父级,因此一旦删除Interview
,它就会认为不再需要orphanRemoval
,并且因此也会删除该记录。
Hibernate文档的状态为here:
...只有关联的父级才有意义将其实体状态转换级联到子级。
浏览该指南中的一些示例,以了解它们如何在Interview
关系中使用级联。