web-dev-qa-db-fra.com

Quelle est la différence entre @NotAudited et RelationTargetAuditMode.NOT_AUDITED dans Hibernate EnVers?

@NotAudited
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@OneToMany(mappedBy = "booking")
@OrderBy("bookingOrder")
private List<CustomerBooking> customerBookingList = new LinkedList<CustomerBooking>();

Pourquoi utiliser les deux? est-il bon d'utiliser les deux ou un seul suffirait-il?

43
Phil

Utilisez NotAudited sur les champs lorsque vous ne souhaitez pas que la valeur/relation soit auditée. Je pense que vous pouvez l’utiliser sur un champ avec ou sans relation telle que OneToMany, ManyToMany ou tout simplement Column. Utilisez RelationTargetAuditMode.NOT_AUDITED sur un champ de relation si vous souhaitez que la valeur soit auditée, mais pas l'entité située de l'autre côté de la relation. Par exemple, vous souhaitez que la valeur ID/clé soit auditée, mais pas la table associée. 

Vous pouvez également appliquer le RelationTargetAuditMode à la classe entière, ce qui, je crois, dit simplement que toutes les relations de la classe ne vérifient pas l'autre extrémité. Cela m'a confondu, car j'utilisais à tort cette annotation pour ne pas auditer l'entité ci-dessous, ce qui n'est pas ce que cela signifie. Il suffit simplement de ne pas avoir d'annotation Audit sur une classe d'entité si vous ne voulez pas que l'entité soit auditée. Sur d'autres entités auditées qui font référence à l'entité, vous devrez soit utiliser NotAudited, soit RelationTargetAuditMode.NOT_AUDITED dans le champ de relation.

La documentation officielle n’est pas excellente à ce sujet ( http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch15.html ) et ne mentionne même pas NotAudited à tout.

Dans mes projets antérieurs, j'avais besoin d'auditer un ensemble très spécifique de tableaux et pas d'autres, alors je devais utiliser ces annotations. J'ai des relations de clé étrangères avec certaines de mes entités non auditées provenant d'entités auditées. J'utilise souvent l'annotation RelationTargetAuditMode.NOT_AUDITED afin qu'au moins je vérifie la valeur/l'ID de la clé étrangère, mais pas l'entité à l'autre bout de la relation. Si vous ne disposez pas de cette annotation, vous obtiendrez une exception d'exécution dans laquelle ENVERS tente d'insérer un enregistrement d'audit dans une table d'audit pour l'entité non auditée et cette table n'existera pas. J'utilise l'annotation NotAudited pour quelques relations de table de joint ManyToMany que je n'ai pas besoin d'auditer et qu'il n'y a rien dans la table d'entité auditée à enregistrer (pas d'ID/valeur de clé étrangère).

Oh oui - les docs ne disent pas ce qui se passera si vous utilisez les deux (vous ne savez pas laquelle est prioritaire), mais je ne pense pas que l'utilisation simultanée des deux sur un même champ est destinée Utilise l'un ou l'autre.

38
Ryan

L'audit de l'entité cible et de ses relations est deux choses distinctes. Cela dépend donc de ce dont vous avez besoin. From Hibernate Envers - Audit d'entité facile documentation:

Si vous souhaitez auditer une relation dans laquelle l'entité cible n'est pas auditée (c'est le cas par exemple pour les entités de type dictionnaire, qui ne changent pas et ne doivent pas être auditées), annotez-la simplement avec @Audited ( targetAuditMode = RelationTargetAuditMode.NOT_AUDITED). Ensuite, lors de la lecture des versions historiques de votre entité, la relation pointe toujours vers l'entité associée "actuelle".

38
WhiteFang34

@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) n'a qu'un seul usage: lorsque l'entité auditée est propriétaire de la relation avec l'entité non auditée et que vous souhaitez obtenir des informations dans les données d'audit sur l'identifiant de l'entité non auditée. Disons que CustomerBooking est audité et que la classe d’hôtel n’est pas auditée. Vous avez deux choix pour le champ Hôtel: @NotAudited (auquel cas vous n’aurez aucune information sur les hôtels dans les données historiques) ou @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED), auquel cas vous aurez toujours le dernier état des hôtels dans les données d’audit. Notez que si Hotel a été audité, RelationTargetAuditMode.NOT_AUDITED sera simplement ignoré (vous aurez des données historiques pour Hotel) .@NotAudited signifie "Je ne me soucie pas de ce champ dans les données historiques" (il ne sera pas sauvegardé , la relation sera nulle, vous ne la verrez pas lorsque vous chercherez des données historiques sur CustomerBooking)

0
Marija Milojkovic