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
参数。协会。