2010-07-07 5 views
4

Mon application utilise de grands arbres d'objets de domaine et pour la plupart de ces objets je voudrais persister quelques informations de base (mises à jour, temps modifié, etc.). J'ai déjà ajouté ces propriétés & colonnes à mon application. J'étais sur le point de coder le réglage de ces valeurs dans tous les différents constructeurs, etc. quand il m'est apparu que la couche de persistance devrait gérer cela de façon transparente.Un moyen facile d'enregistrer les données d'audit de base sur les objets de domaine?

Mais comment?

Je pourrais certainement le faire à partir de mes DAO, mais comment gérer les objets qui sont persistés via une sauvegarde en cascade? Y at-il un moyen d'intercepter la méthode persist() sur ceux-ci?

Quelle est une bonne manière d'implémenter cette capacité?

Répondre

5

Si vous envisagez d'utiliser JPA à des fins d'audit, vous pouvez vous fier aux annotations de rappel PrePersist et PreUpdate. Le JPA WikiBook has one such example. Cela aide grandement d'avoir une superclasse mappée dans ce cas, sinon vous continuerez à le faire via le code espace "utilisateur".

Une autre façon de procéder consiste à utiliser des déclencheurs (ahem) sur les tables. Cela a cependant un impact sur les performances. Le Openbravo ERP project semble utiliser cette approche pour générer la piste d'audit.

Mise à jour: Il est une bonne idée d'avoir la fonctionnalité d'audit séparé dans une autre classe, autre que la classe super du modèle de domaine. Les auditeurs d'événements de JPA vous aideront à atteindre la même chose. Un bon exemple est présent here.

+0

bonté JPA pure. Merci pour le conseil et le lien concernant PrePersist et PreUpdate. Quant à l'idée de stocker toutes les informations d'audit dans un seul tableau, cela ressemble à un goulot d'étranglement potentiel de performance ... non? – HDave

+1

Hmm, c'est une question intéressante; la réponse dépend de ce que vous stockez dans la table unique et à quelle fréquence est-il demandé. Si vous vous attendez à ce que les utilisateurs interrogent et consultent relativement beaucoup d'informations d'audit dans le cours normal des opérations, il est préférable d'auditer chaque entité séparément. Cependant, si la table d'audit est censée être plus ou moins une table uniquement SELECT, elle est moins nocive, car vous n'avez que des INSERT à vous soucier des performances. Je pense qu'un certain niveau de planification de la capacité est nécessaire pour anticiper le nombre d'entrées en production. –

+0

Dans mon cas particulier, la plupart du temps il y aura beaucoup de mises à jour et d'interrogation de cette information, donc je vais continuer à le stocker dans le même enregistrement que l'entité. Cependant, j'ai quelques endroits où externaliser cette information serait une grande aide. – HDave

6

Vous pouvez jeter un oeil à Hibernate Envers.

+0

Wow - Envers est génial. Comment n'en ai-je jamais entendu parler auparavant? Sera l'envisager sérieusement. – HDave

Questions connexes