Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在双向关联上禁用Hibernate外键约束?_Java_Hibernate_Foreign Keys_Hibernate Annotations - Fatal编程技术网

Java 如何在双向关联上禁用Hibernate外键约束?

Java 如何在双向关联上禁用Hibernate外键约束?,java,hibernate,foreign-keys,hibernate-annotations,Java,Hibernate,Foreign Keys,Hibernate Annotations,我正在尝试禁用在双向关联上生成的外键约束。我已经设法为我所有的单向协会做到了这一点,但出于某种原因,它在这里不起作用 我确实知道最近在Hibernate 5.x中修复的ContrainMode.NO_约束的错误,我正在运行最新的Hibernate 5.2.6 我的注释目前如下所示: class Parent { @OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval=true) @OrderColumn(n

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

我确实知道最近在Hibernate 5.x中修复的ContrainMode.NO_约束的错误,我正在运行最新的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;
  }
}
类父类{
@OneToMany(mappedBy=“parent”,cascade=CascadeType.ALL,orphan=true)
@OrderColumn(name=“childIndex”)
公共列表getChildren(){
返回儿童;
}
}
班童{
@多通(可选=假)
@JoinColumn(name=“parent”,foreignKey=@foreignKey(value=ConstraintMode.NO_CONSTRAINT))
公共父getParent(){
返回父母;
}
}
但是,尽管没有约束,Hibernate仍然在child.parent->parent.id上创建外键约束

对于双向情况,是否需要执行其他操作来抑制外键


谢谢

这是Hibernate中的已知问题,请参阅

解决方案是在映射端添加@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;
  }

}
类父类{
@OneToMany(mappedBy=“parent”,cascade=CascadeType.ALL,orphan=true)
@OrderColumn(name=“childIndex”)
@org.hibernate.annotations.ForeignKey(name=“无”)
公共列表getChildren(){
返回儿童;
}
}
注意:更喜欢引入的JPA2.1
javax.persistence.ForeignKey
。本机批注已弃用。

添加到@answer:

您可以通过以下方式组合
@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;
  }

}
类父类{
@OneToMany(cascade=CascadeType.ALL,orphan=true)
@JoinColumn(name=“parent”,foreignKey=@javax.persistence.foreignKey(name=“none”))
公共列表getChildren(){
返回儿童;
}
}

此答案中给出的注释是错误的
javax.persistence.ForeignKey
是OP中使用的。它不起作用,并且不能应用于字段。
@org.hibernate.annotations.ForeignKey
现在已被弃用,有不同的解决方案吗?@KonradDrozd如果您查看上面提到的问题,这个问题似乎已经被修复(使用
@JoinColumn)(foreignKey=@foreignKey(ConstraintMode.NO_CONSTRAINT))
)在Hibernate版本5.3.3和5.4.x中。我自己还没有尝试过,也许你可以尝试一下。@BustanilArifin它可以工作,但是IDE显示了这样一个警告“类型foreignKey不推荐使用”。当使用
mappedBy
关联时,这不是一个合适的解决方案(物理外键存储在另一个表中的位置);您将得到如下错误:“标记为mappedBy的关联不能定义@JoinTable或@JointColumn之类的数据库映射”。Hibernate将尝试生成一个不应该生成的列。