【问题标题】:Hibernate attempts to delete parent entity in unidirectional ManyToOne relationshipHibernate 尝试删除单向多对一关系中的父实体
【发布时间】:2020-11-11 08:06:41
【问题描述】:

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

定义如下

@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 的所有合适组合(仍然尝试删除用户)并定义了一个反向但由用户关系拥有的 - 到目前为止没有成功。最重要的是,我尝试了搜索功能;),这使我得出结论,这只是我的问题。如果我错过了一个已回答的问题,我将不胜感激指向正确方向的指针。谢谢。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

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

    如果所有这些都没有帮助,请创建一个复制的test case 并将问题提交给Hibernate issue tracker

    【讨论】:

    • 我在该类型中确实有其他 @ManyToOne 关系,尽管 IIRC 没有不可为空的关系。我会在星期一检查,因为我现在无法访问代码。但只是出于好奇,为什么这会很重要?我之前尝试过调试那部分,但是在 spring data 和 hibernate 之间,我迷失在代码层中——这已经很多年没有发生了,所以我会在星期一再试一次,看看我是否还能调试 :) 如果没有有帮助,而且由于这不是我的代码,而是客户的代码,我将不得不重现一个测试用例,希望能显示相同的行为。谢谢!
    • 删除可能通过非空关联引用的对象可能会导致关联的所有者也被删除,这可能是这里的问题。
    • 所以,我查了一下,没有其他非空标签关系。我将尝试重现一个测试用例,因为我无法再访问有问题的代码(截至今天)。除了遇到实际问题(我不再遇到)之外,我真的很想了解这种行为,因为我多年来没有遇到过我无法理解或解决的休眠问题;)非常感谢你的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2020-01-23
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多