【问题标题】:Foreign key constraint error in JPAJPA中的外键约束错误
【发布时间】:2013-06-18 19:23:09
【问题描述】:

我有三个如下所示的实体:

@Entity
class EntityA{       
    @OneToMany(cascade = javax.persistence.CascadeType.ALL, orphanRemoval = true)
    private List<EntityB> _candidates = null;
}

@Entity
class EntityB{       
   @OneToOne
   private EntityC _comp;
}

@Entity
class EntityC{
...
}

EntityB 具有EntityC 类型的属性。当instanceCEntityC 的实例instanceC 被删除时,所有引用它的instancesBEntityB 实例也必须从包含instancesBEntityA 的实例中删除。

我可以通过注解实现这种行为吗?在代码的当前状态下,删除 EntityC 对象时出现以下异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败

【问题讨论】:

  • 我认为你需要定义更多的关系。您应该在引用EntityAEntityB 中添加@ManyToOne 关系。您还应该将@OneToOne 添加到引用EntityBEntityC。然后您可以将CascadeType 属性添加到您的所有关系中。
  • 嗨@jahroy,感谢您的回复!这种方法似乎不起作用。我得到相同类型的错误。 EntityAEntityC 引用 EntityB 不是有问题吗?如果外键约束失败,我无法删除 AC
  • 如果B 包含C,则在删除B 之前,您无法删除C。这就是外键的工作方式......我不确定你可以通过使用注释来改变它。另外,我不知道你是否愿意。我认为您需要编写一些业务逻辑来管理您的关系。说了这么多,我觉得我还不够专家在这里给你权威的建议。

标签: java jpa orm one-to-many many-to-one


【解决方案1】:

您的 B 表具有 A 和 C 的外键以及必须维护的当前映射。因为 fk 到 A 是由 A 的 OneToMany 到 B 控制的,所以只要在删除 B 时删除 A 对 B 的引用,这个问题就不会太大,只是为了让缓存的实体与更改保持同步。另一方面,与 C 的关系要求您在删除 B 之前从 B 中取消引用 C,或者删除 B - 否则 B 表中的 fk 将保留,违反约束。正如 cmets 所述,您在删除实体时需要一定程度的关系管理。

【讨论】:

  • 我相信在无状态会话 bean 的方法中维护这些关系是一种常见的做法(如果您使用的是 EJB)。
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 2018-10-23
  • 2018-09-15
相关资源
最近更新 更多