如何在休眠中仅删除@OneToOne双向映射的一侧

时间:2018-12-03 20:54:59

标签: java spring hibernate spring-mvc

我在两个单独的实体中有两列

  

采访实体

@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实体。

1 个答案:

答案 0 :(得分:2)

您应仅在 parent 实体(在您的情况下为renderComponent: CustomRenderComponent)上使用ng2-smart-tablecascade = ...。在关联的两端都使用级联是没有意义的(对于任何关系,不仅是一对一的关系)。考虑级联的作用,以及当您尝试创建新的orphanRemoval = ...时会发生什么。 Applicant说,Interview实体需要创建CascadeType.PERSIST,如果面试对象被赋予了申请人字段。创建申请人后,它会看到申请人实体具有Interview,这意味着它需要保留其拥有的任何Applicant字段,因此它将再次尝试创建CascadeType.ALL,因为您已经创建了采访,所以这没有任何意义。

我之所以会删除Interview是因为您两边都有Interview。 Hibernate查看Applicant并认为,因为它有orphanRemoval是关联的父级,因此一旦删除Interview,它就会认为不再需要orphanRemoval,并且因此也会删除该记录。

Hibernate文档的状态为here

  

...只有关联的父级才有意义将其实体状态转换级联到子级。

浏览该指南中的一些示例,以了解它们如何在Interview关系中使用级联。