2

我使用 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<Child> getChildren() { return children; }   
public void setChildren( List<Child> children ) { this.children = children; }
private transient List<TitleMetadataCategory> children;
...
 }

@Entity
public class Child {
....
}

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

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

它失败。

因为我没有

@ManyToOne( optional=false )

在孩子方面,Hibernate 尝试使用 PARENT_ID=NULL 更新孩子,但由于 DB 约束而失败。

有什么办法可以解决吗?

4

3 回答 3

4

你有没有尝试过

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

?

另外,请注意附加的实体是自动持久的。你不需要打电话saveOrUpdate()

于 2013-01-17T13:40:48.240 回答
2

JB Nizet 的答案是有效的,但有一个更正。由于我也有 Child.getParentId() 方法(不是 getParent() ),它的 Column 注释nullable=false, insertable=false, updateble=false除了nullable=false, updatable=false在 Parent.getChildren() 关联中还应该有参数。

于 2013-01-18T13:43:19.997 回答
0

Child使用当前配置,当您从集合中删除它时,Hibernate 不知道必须将其删除children(这称为孤立删除)。你需要@OneToMany(orphanRemoval=true)在父母。org.hibernate.annotations.CascadeType.DELETE仅指定在删除整个父级时也应删除子级。

于 2013-01-17T13:51:32.643 回答