我正在尝试禁用在我的双向关联上生成的外键约束。我已经设法为我的所有单向关联做了这个,但由于某种原因它在这里不起作用。
我确实知道最近在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上创建外键约束 - &gt; parent.id。
我是否需要做一些额外的事情来抑制双向情况的外键?
谢谢!
答案 0 :(得分:5)
这是Hibernate中的已知问题,请参阅https://hibernate.atlassian.net/browse/HHH-8805
解决方案是在映射的一侧添加 @ org.hibernate.annotations.ForeignKey(name =&#34; none&#34;)。
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
。不推荐使用本机注释。
答案 1 :(得分: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;
}
}