2010-09-17 183 views
19

我在我的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.stackoverflow.com/questions/306144/jpa-cascadetype-all-does-not-delete-orphans) – 2010-09-17 21:40:18

回答

23

對於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