jpa从集合中删除孩子

问题描述:

我在我的web-app中使用JPA而不是Hibernate。这里有两个实体(仅干将显示):jpa从集合中删除孩子

 
class Child { 

    private Parent parent; 

    @ManyToOne(optional=false) 
    @JoinColumn(name="parent_id", referencedColumnName="parent_id", nullable=false, updatable=false) 
    public Parent getParent() { 
    return parent; 
    } 
} 

class Parent { 

    private Collection children; 

    @OneToMany(fetch=FetchType.EAGER, mappedBy="parent", cascade={CascadeType.ALL}) 
    public Collection getChildren() { 
    return children; 
    } 
} 

正如你看到的ParentChild涉及为“一到多”。

现在我需要加载一个Parent实例,删除一些或全部子节点并保存更改。下面的代码不为我工作:

 
Parent p = entityManager.find(Parent.class, 12345L); // load entity 
p.getChildren().clear(); // remove all children 
entityManager.merge(p); // try to save 

子实体未在例如删除上面。现在我必须为每个孩子手动拨打entityManager.remove()

有没有更简单的方法来管理儿童收集?请注意,我不想使用Hibernate特有的功能,只使用纯粹的JPA。

问候, 安德烈

+0

可能重复: //www.*.com/questions/306144/jpa-cascadetype-all-does-not-delete-orphans) – 2010-09-17 21:40:18

对于JPA 2.0你可以设置的@OneToMany

orphanRemoval=true对于JPA 1.0,你应该使用专用的休眠注解。这是@Cascade注释(而不是cascade属性),与

@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN}) 

休眠3.5+实施JPA 2.0

的[JPA CascadeType.ALL不会删除孤儿。](HTTP
+0

JPA 1.0有没有解决方案?我没有准备好更改JPA实现者。 – Andrey 2010-09-17 21:06:10

+0

@Andrey是的,我刚刚添加它 – Bozho 2010-09-17 21:06:39

+0

谢谢,这是一个好方法。设置orphanRmoval,当合并时可以删除孤儿子 – Scarlett 2011-12-08 08:05:07