2010-09-17 5 views
19

J'utilise JPA sur Hibernate dans mon application web. Voici deux entités (uniquement getters sont représentés):jpa retirer un enfant de la collection

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

Comme vous le voyez Parent et Child rapportez comme "one-to-many".

Maintenant, j'ai besoin de charger une instance Parent, supprimer une partie ou tous les enfants et enregistrer les modifications. Ci-dessous le code qui ne fonctionne pas pour moi:

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

Les entités enfants ne sont pas supprimées dans l'exemple ci-dessus. Maintenant, je dois appeler manuellement entityManager.remove() pour chaque enfant.

Existe-t-il un moyen plus simple de gérer la collecte des enfants? Veuillez noter que je ne souhaite pas utiliser la fonctionnalité spécifique à Hibernate, mais uniquement JPA pure.

Cordialement, Andrey

+0

double possible de [JPA CascadeType.ALL ne supprime pas les orphelins.] (Http: //stackoverflow.com/questions/306144/jpa-cascadetype-all-does-not-delete-orphans) –

Répondre

23

Pour 2.0 JPA vous pouvez définir orphanRemoval=true du @OneToMany

Pour JPA 1.0, vous devez utiliser des annotations spécifiques en veille prolongée. C'est l'annotation @Cascade (au lieu de l'attribut cascade), avec une valeur de

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

Hibernate 3.5+ mettre en œuvre JPA 2.0

+0

Existe-t-il une solution pour JPA 1.0? Je ne suis pas prêt à changer d'implémentation JPA. – Andrey

+0

@Andrey oui, je viens de l'ajouter – Bozho

+0

Merci, c'est un bon moyen. set orphanRmoval, quand la fusion peut supprimer l'enfant orphelin – Scarlett

Questions connexes