首页 > 解决方案 > Hibernate 尝试删除单向多对一关系中的父实体

问题描述

我在实体上有一个简单的单向多对一关系,不幸的是,它是在我无法更改的模式中定义的。

定义如下

@Entity
@Table(name="Profile")
...
public class Profile{
  
  @ManyToOne
  @JoinColumn(name="usr_id", nullable=false, updatable=false)
  private User usr;
...

一切都很好。该关系通过数据库中的外键强制执行,因此 nullable = false 和 updatable = false。没有提到用户中的配置文件。当我尝试删除 Profile 时,hibernate 还会尝试删除 User 实体,该实体是其他关系的父级,因此失败。我在任何地方都没有 CascadeType 注释。

我的意图是在 usr 字段中使用此配置文件对用户进行简单引用。这是一个单向的关系。每当我删除配置文件时,用户实体都不应受到影响。当 usr 字段可能在删除之前被取消引用时,这似乎是可以实现的(我可以在休眠生成的 sql 中看到休眠尝试在删除之前将该字段设置为 null) - 但是由于外键而失败。

我正在努力做的事情可以实现吗?如果是这样,怎么做?

(如果相关的话,我在hibernate之上使用spring数据。)

更多信息:我尝试了 optional=false,它导致删除父实体行为。我已经尝试了 CascadeTypes、@OnDelete 和 NO_ACTION 的所有合适组合(仍然尝试删除用户)并定义了一个反向但由用户关系拥有的 - 到目前为止没有成功。最重要的是,我尝试了搜索功能;),这使我得出结论,这只是我的问题。如果我错过了一个已回答的问题,我将不胜感激指向正确方向的指针。谢谢。

标签: javahibernate

解决方案


您是否有某种其他不可为空的关联或@ManyToOne实体?您可以通过在例如 JDBC 驱动程序中设置断点来调试删除过程,然后将堆栈帧向下移动到级联部分以找出这种级联发生的原因。@OneToOneProfileConnection.prepareStatement

如果这一切都没有帮助,请创建一个重现测试用例并将问题提交给Hibernate 问题跟踪器


推荐阅读