2010-09-17 18 views
19

Sto utilizzando JPA su Hibernate nella mia app Web. Qui ci sono due entità (solo sono indicati getter):jpa rimozione bambino dalla raccolta

 
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; 
    } 
} 

Come vedete Parent e Child riferiscono come "uno-a-molti".

Ora ho bisogno di caricare un'istanza Parent, rimuovere alcuni o tutti i bambini e salvare le modifiche. Di seguito è riportato il codice che non funziona per me:

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

Le entità figlio non vengono rimosse nell'esempio sopra. Ora devo chiamare manualmente entityManager.remove() per ogni bambino.

Esiste un modo più semplice per gestire la raccolta dei bambini? Si prega di notare che non voglio usare funzionalità specifiche di Hibernate, ma solo JPA puro.

saluti, Andrey

+0

possibile duplicato del [JPA CascadeType.ALL non elimina orfani.] (Http: //stackoverflow.com/questions/306144/jpa-cascadetype-all-does-not-delete-orphans) –

risposta

23

Per JPA 2.0 è possibile impostare orphanRemoval=true del @OneToMany

Per JPA 1.0, è necessario utilizzare le annotazioni hibernate-specifici. Questo è il @Cascade annotazioni (anziché l'attributo cascade), con un valore di

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

Hibernate 3.5+ attuare JPA 2.0

+0

Esiste una soluzione per JPA 1.0? Non sono pronto a cambiare l'implementatore di JPA. – Andrey

+0

@Andrey si, l'ho appena aggiunto – Bozho

+0

Grazie, è un buon modo. imposta orphanRmoval, quando l'unione può cancellare il figlio orfano – Scarlett

Problemi correlati