Java 如何在双向关联上禁用Hibernate外键约束?
我正在尝试禁用在双向关联上生成的外键约束。我已经设法为我所有的单向协会做到了这一点,但出于某种原因,它在这里不起作用 我确实知道最近在Hibernate 5.x中修复的ContrainMode.NO_约束的错误,我正在运行最新的Hibernate 5.2.6 我的注释目前如下所示: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
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.1javax.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将尝试生成一个不应该生成的列。