如何在双向关联上禁用休眠外键约束?

我正在尝试禁用在双向关联上生成的外键约束。我已经设法为我的所有单向关联执行此操作,但由于某种原因,它在这里不起作用。

我确实知道最近在Hibernate 5.x中修复的ContraintMode.NO_CONSTRAINT错误,并且我正在运行最新的Hibernate 5.2.6。

我的注释现在如下所示:

class Parent {
  @OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval=true)
  @OrderColumn(name="childIndex")
  public List<Child> getChildren() {
    return children;
  }
}

class Child {
  @ManyToOne(optional=false)
  @JoinColumn(name="parent", foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
  public Parent getParent() {
    return parent;
  }
}

但是,尽管NO_CONSTRAINT,Hibernate仍在对child.parent -> parent.id 创建外键约束。

我是否需要执行其他操作来抑制双向情况的外键?

谢谢!


答案 1

这是休眠中的已知问题,请参阅 https://hibernate.atlassian.net/browse/HHH-8805

解决方案是在映射侧添加@org.hibernate.annotations.ForeignKey(name = “none”)。)。

class Parent {

  @OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval=true)
  @OrderColumn(name="childIndex")
  @org.hibernate.annotations.ForeignKey(name = "none")
  public List<Child> getChildren() {
    return children;
  }

}

注意:更喜欢引入的 JPA 2.1。本机批注已弃用。javax.persistence.ForeignKey


答案 2

除了@Bustanil Arifin的答案:

您可以组合,然后以以下方式:@OneToMany@javax.persistence.ForeignKey

class Parent {

  @OneToMany(cascade=CascadeType.ALL, orphanRemoval=true)
  @JoinColumn(name = "parent", foreignKey = @javax.persistence.ForeignKey(name = "none"))
  public List<Child> getChildren() {
    return children;
  }

}

推荐