Hibernate单向OneToMany删除违反约束(在父端可选= false?)

我使用Hibernate 3.6,我有这样的东西:

@Entity public class Parent { @OnyToMany( fetch = FetchType.LAZY, cascade = { ascadeType.ALL } ) @Cascade( { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE ) @JoinColumn( name="Parent_ID" ) public List getChildren() { return children; } public void setChildren( List children ) { this.children = children; } private transient List children; ... } @Entity public class Child { .... } 

关联是单向的,有几个原因,我不想改变它。 此外,孤儿子不存在,因此存在DB约束,即CHILD.PARENT_ID不为空。 一切正常,除了去除孩子。 当我做

parent.getChildren().remove(child); session.saveOrUpdate(parent) parent.getChildren().remove(child); session.saveOrUpdate(parent)

它失败。

既然我没有

 @ManyToOne( optional=false ) 

在子端,Hibernate尝试更新PARENT_ID = NULL的子节点,并由于DB约束而失败。

有没有办法解决它?

你有没有尝试过

 @JoinColumn(name = "Parent_ID", nullable = false) 

另请注意,附加实体是自动持久的。 您不需要调用saveOrUpdate()

使用当前配置时,Hibernate不知道从Child中删除Child它必须被删除(它被称为orphan删除)。 在父级中需要@OneToMany(orphanRemoval=true)org.hibernate.annotations.CascadeType.DELETE仅指定在删除整个父项时也应删除子项。

JB Nizet的答案正在发挥作用,但只有一次修正。 由于我也有Child.getParentId()方法(不是getParent()),因此除了nullable=false, updatable=false在Parent.getChildren()中,它的Column注释应该有nullable=false, insertable=false, updateble=false参数。协会。