2012-08-08 2 views
3

J'ai la configuration suivante: il existe diverses entités (Projects, Tests, Users) et puis il y a TestReports. Le TestReports référence les autres entités et également quelques données supplémentaires dans le système de fichiers.Référencement des entités supprimées dans JPA/Hibernate

Les rapports sont générés et ne sont jamais supprimés (pour l'audit). Cependant, les autres entités peuvent être supprimées. Cela conduit à la situation, lorsque le rapport fait référence à une entité supprimée. C'est OK du point de vue commercial, le rapport pourrait simplement afficher [deleted id123] au lieu de l'étiquette de l'entité supprimée et ce serait bien. Cependant, je reçois javax.persistence.EntityNotFoundException, quand j'essaye de charger un rapport qui référence l'entité supprimée.

Existe-t-il un moyen de dire à Hibernate/JPA de créer simplement un objet fantôme avec ID et un drapeau isDeleted dans un tel cas?

Dans la documentation Hibernate Envers, j'ai constaté qu'ils supportaient quelque chose comme ça en parcourant l'historique des révisions, mais je n'ai pas trouvé le moyen de l'utiliser dans les entités 'normales'.

De la documentation Envers:

Le second paramètre, selectDeletedEntities, spécifie si les révisions, dans laquelle l'entité a été supprimée doivent être inclus dans les résultats. Si oui, ces entités auront le type de révision DEL et tous les champs, à l'exception de l'id, null.

Je suis au courant de solution en introduisant deleted drapeau sur tous les objets et utiliser si pour douce suppression, au lieu de la suppression réelle. Mais cela ajoute un surcoût supplémentaire, que je voudrais éviter.

Répondre

4

Je ne sais pas si c'est ce que vous cherchez. Vous pouvez indiquer à hibernate de définir une valeur nulle sur le champ plutôt que de troquer une EntityNotFoundException, en utilisant l'annotation @NotFound(action=NotFoundAction.IGNORE). Il n'y a pas beaucoup de documentation à ce sujet, vous pouvez trouver comment l'utiliser here.

+0

Merci, cela semble presque ce que je voulais. Savez-vous s'il existe une façon standard de faire la distinction entre aucune référence réelle et ignorée non trouvée? – Michal

+0

Je ne sais pas et je ne pense pas que Hibernate offre une telle facilité: S. – Augusto

0

J'ai une situation similaire et je l'avais fait:
Je ne supprime jamais ces choses. Au lieu de cela, je définir un deletion time pour ceux qui sont supprimés. Lors du chargement des données, les objets sont récupérés avec succès, mais comme je vérifie leur deletion time je montre [deleted].

Cependant, c'est la solution que j'ai trouvée, vous pourriez en trouver une autre.

MISE À JOUR
Vous pouvez essayer celui-ci ainsi:
Catch javax.persistence.EntityNotFoundException et insérer manuellement une valeur quelconque à ce champ. Dans ce cas, vous êtes en mesure de voir lesquels sont supprimés et qui n'ont pas de référence.

+0

Merci, votre solution offre certainement plus de flexibilité, mais serait probablement trop pour moi. – Michal

+0

J'ai mis à jour ma réponse. Celui-ci pourrait travailler pour vous. –

+0

Je pourrais manquer quelque chose, mais je ne comprends pas, comment je peux m'aider en attrapant 'EntityNotFoundException' en appelant' query.getResultList() '. – Michal

Questions connexes