2010-04-08 4 views
2

Je suis encore un peu indécis, ce qui est la meilleure pratique pour gérer em.remove(entity) avec cette entité étant dans plusieurs collections mappées en utilisant mappedBy en JPA.Meilleure pratique lors de la suppression d'une entité concernant des collections mappedBy?

Tenir compte d'une entité comme un Property qui fait référence à trois autres entités: un Descriptor, une BusinessObject et une entité Level. Le mappage est défini à l'aide de @ManyToOne dans l'entité Property et en utilisant @OneToMany(mappedBy...) dans les trois autres objets. Ce mappage inverse est défini car il existe certaines situations dans lesquelles j'ai besoin d'accéder à ces collections.

Chaque fois que je supprime une propriété à l'aide de em.remove(prop), cet élément n'est pas automatiquement supprimé des entités gérées des trois autres types. Si je m'en fiche et que le chargement de la page suivante (webapp) ne recharge pas ces entités, la propriété est toujours trouvée et certaines décisions qui ne sont plus vraies peuvent être prises. Les mappages inverses peuvent devenir assez volumineux et je ne veux pas utiliser quelque chose comme descriptor.getProperties().remove(prop) car il va charger toutes les propriétés qui ont pu être chargées paresseux jusque là. Donc, mon moyen actuellement préféré est de rafraîchir l'entité si elle est gérée: if (em.contains(descriptor)) em.refresh(descriptor) - qui décharge une collection éventuellement chargée et déclenche un rechargement lors de l'accès suivant.

Existe-t-il un autre moyen pratique de gérer toutes les collections mappedBy d'entites déjà chargées?

Répondre

1

Vous êtes la solution de vérifier si une entité est gérée semble excellente. Pourquoi ne le programmez-vous pas sur les @PreRemove et @PrePersist de l'entité, pourquoi? De cette façon, il vous suffit de le programmer une fois et cela vous permet d'être toujours cohérent (sans aucune manipulation manuelle).

Une autre solution consiste à toujours rediriger après les mises à jour et les insertions, ce qui force le contrôleur à interroger JPA au lieu d'utiliser les objets du modèle manipulé.

Mise à jour: Vous pouvez également consulter: JPA implementation patterns

+0

Merci pour vos pensées. L'utilisation des événements de persistance peut être un peu difficile pour moi car mon modèle ne se réfère pas à un gestionnaire d'entité lui-même et est utilisé dans un contexte Seam - la méthode d'actualisation pourrait ne pas fonctionner de cette façon. Et le add()/remove() sur les collections associées sera trop cher pour les grandes collections. –

+0

J'ai accepté la solution car elle approuve plus ou moins ma mise en œuvre actuelle. L'idée avec les événements de persistance est agréable et utile dans certains cas. –