【问题标题】:How do I disable Hibernate foreign key constraint on a bidirectional association?如何在双向关联上禁用 Hibernate 外键约束?
【发布时间】:2017-01-18 21:24:26
【问题描述】:

我正在尝试禁用在我的双向关联中生成的外键约束。我已经设法为我所有的单向关联做到了这一点,但由于某种原因,它在这里不起作用。

我确实知道最近在 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 上创建外键约束。

我需要做些什么来抑制双向情况的外键吗?

谢谢!

【问题讨论】:

    标签: java hibernate foreign-keys hibernate-annotations


    【解决方案1】:

    这是 Hibernate 中的已知问题,请参阅 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。原生注解已弃用。

    【讨论】:

    • 这个答案中给出的注释是错误的。 javax.persistence.ForeignKey 是 OP 中使用的。它不起作用,并且不能应用于字段。
    • @org.hibernate.annotations.ForeignKey 现在已弃用,有不同的解决方案吗?
    • @KonradDrozd 如果您查看上面提到的问题,似乎该问题已在 Hibernate 版本 5.3.3 和 5.4.x 中得到修复(使用 @JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)))。我自己没试过,也许你可以试一试。
    • @BustanilArifin 它可以工作,但 IDE 显示此警告“不推荐使用 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;
      }
    
    }
    

    【讨论】:

    • 当使用mappedBy 关联(物理外键存储在另一个表中)时,这不是一个合适的解决方案;你会得到类似的错误:“标记为 mappedBy 的关联不能定义像 @JoinTable 或 @JoinColumn 这样的数据库映射”。 Hibernate 会尝试在它不应该生成的地方生成一个列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多