J’utilise JPA sur Hibernate dans mon application Web. Voici deux entités (seuls les accesseurs sont affichés):
classe Child { parent privé parent; @ManyToOne (optionnel = false) @JoinColumn (name = "parent_id", referenceColumnName = "parent_id", nullable = false, updatable = false) public Parent getParent () { parent de retour; } } classe Parent { Collection privée enfants; @OneToMany (fetch = FetchType.EAGER, mappedBy = "parent", cascade = {CascadeType.ALL}) collection publique getChildren () { retourner les enfants; } }
Comme vous le voyez, Parent
et Child
rapportent comme “un à plusieurs“.
Maintenant, je dois charger une instance Parent
, supprimer certains enfants 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); // charge l'entité p.getChildren (). clear (); // enlève tous les enfants entityManager.merge (p); // essaie de sauver
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 les fonctionnalités spécifiques à Hibernate, mais uniquement du JPA pur.
Cordialement, Andrey
Pour JPA 2.0, vous pouvez définir orphanRemoval=true
sur le @OneToMany
Pour JPA 1.0, vous devez utiliser des annotations spécifiques à hibernate. C’est l’annotation @Cascade
(au lieu de l’atsortingbut cascade
), avec une valeur de
@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})
Hibernate 3.5+ implémente JPA 2.0