Java 如何在hibernate中只删除@OneToOne双向映射的一侧
我在两个单独的实体中有两列 采访实体 申请实体 问题是,如何正确地映射它,以便运行Java 如何在hibernate中只删除@OneToOne双向映射的一侧,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我在两个单独的实体中有两列 采访实体 申请实体 问题是,如何正确地映射它,以便运行service.deleteSession()并仅删除访谈实体记录? 如果我使用cascadeType.all删除申请人实体。我尝试将其更改为持久化,然后得到一个500错误,表示如果调用该函数,将重新创建实体 添加孤立删除=true时出现此异常org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[null] 但是,我想把
service.deleteSession()编码>并仅删除访谈
实体记录?
如果我使用cascadeType.all
删除申请人
实体。我尝试将其更改为持久化,然后得到一个500错误,表示如果调用该函数,将重新创建实体
添加孤立删除=true
时出现此异常org.springframework.dao.DataIntegrityViolationException:无法执行语句;SQL[n/a];约束[null]代码>
但是,我想把mappedBy
分配给interview
实体,我不确定这是否是解决方案,而且我有保留意见,因为我的面试
实体是在创建申请人
实体之后创建的。您应该只在父实体上使用级联=…
和孤儿移除=…
(在您的情况下,申请人
)。在关联的两侧使用级联是没有意义的(对于任何关系,而不仅仅是一对一)。想想层叠会做什么,以及当您尝试创建一个新的访谈时会发生什么CascadeType.PERSIST
表示如果给面试对象一个申请者字段,那么面试
实体需要创建一个申请者
。创建申请者后,它会看到申请者实体具有CascadeType.ALL
,这意味着它需要保留它所具有的任何面试
字段,因此它会再次尝试创建一个面试
,这是没有意义的,因为您已经创建了面试
我猜它为什么要删除申请人
,是因为两边都有删除
。Hibernate查看面试
,认为因为它有删除
,所以它是关联的父方,所以一旦删除面试
,它认为不再需要申请人
,因此也会删除该记录
Hibernate文档的状态如下:
。。。只有关联的父端才有意义将其实体状态转换级联到子级
浏览该指南中的一些示例,了解它们如何在OneToOne
关系中使用级联。在调用存储库中的实际删除方法之前,请将父/子实体设置为null
。现在请尝试,谢谢。这是一种优雅的处理方式吗?看起来很混乱,因为我觉得hibernate应该处理这个…@Mr.Skip这不起作用,我得到了org.springframework.dao.DataIntegrityViolationException:cannotexecute语句;SQL[n/a];约束[null]代码>我两边都有空值。我们将查看转发的信息,非常感谢。
@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;