org envers ejemplo audited auditable java hibernate hibernate-envers

java - envers - spring audit aspect



¿Cuál es la diferencia entre @NotAudited y RelationTargetAuditMode.NOT_AUDITED en Hibernate EnVers? (3)

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

¿Por qué usar ambos? ¿es bueno usar ambos o bastaría?


La auditoría de la entidad objetivo y sus relaciones son dos cosas separadas. Entonces depende de lo que necesitas. De Hibernate Envers : documentación de Easy Entity Auditing :

Si desea auditar una relación, donde la entidad objetivo no está auditada (ese es el caso, por ejemplo, con entidades tipo diccionario, que no cambian y no necesitan ser auditadas), simplemente anótelo con @Audited ( targetAuditMode = RelationTargetAuditMode.NOT_AUDITED). Luego, al leer versiones históricas de su entidad, la relación siempre apuntará a la entidad relacionada "actual".


Use NotAudited en los campos cuando no desee que se audite el valor / relación. Creo que puede usar esto en un campo con o sin una relación como OneToMany, ManyToMany o simplemente Column. Use RelationTargetAuditMode.NOT_AUDITED en un campo de relación si desea que se audite el valor, pero no la entidad del otro lado de la relación. Por ejemplo, quiere que se audite el valor de ID / clave, pero no la tabla relacionada.

También puede aplicar RelationTargetAuditMode a toda la clase, lo que creo que solo dice para todas las relaciones en la clase no auditar el otro extremo. Esto me confundió ya que estaba usando erróneamente esta anotación para decir que no audita la entidad a continuación, que no es lo que significa. Simplemente no tiene una anotación de auditoría en una clase de entidad en absoluto si no desea que la entidad sea auditada. En otras entidades auditadas que se refieren a la entidad, deberá utilizar NotAudited o RelationTargetAuditMode.NOT_AUDITED en el campo de relación.

La documentación oficial no es excelente sobre este tema ( http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch15.html ) y ni siquiera menciona NotAudited en absoluto.

En mis proyectos anteriores, tuve la necesidad de auditar un conjunto muy específico de tablas y no otras, así que necesitaba usar estas anotaciones. Tengo relaciones de claves externas con algunas de mis entidades no auditadas de algunas entidades auditadas. A menudo uso la anotación RelationTargetAuditMode.NOT_AUDITED para que al menos audite el valor / ID de la clave foránea, pero no la entidad en el otro extremo de la relación. Si no tiene esta anotación obtendrá una excepción en tiempo de ejecución donde ENVERS intenta insertar un registro de auditoría en una tabla de auditoría para la entidad no auditada y esa tabla no existirá. Utilizo la anotación NotAudited para algunas relaciones de mesa ManyToMany join que simplemente no necesito auditar y no hay nada en la tabla de entidad auditada para grabar (sin ID / valor de clave foránea).

Ah, sí, los documentos no dicen qué pasa si usas ambos (no estoy seguro de cuál tiene prioridad), pero no creo que se utilicen ambos simultáneamente en un campo dado. Usar uno u otro.


@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) tiene solo un uso: cuando tiene una entidad auditada que posee la relación con la entidad no auditada y desea información en los datos de auditoría sobre la identificación de la entidad no auditada. Digamos que CustomerBooking está auditado y que la clase Hotel no está auditada. Tiene dos opciones para el campo Hotel: @NotAudited (en cuyo caso no tendrá información sobre el hotel en datos históricos) o @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) en cuyo caso tendrá siempre el último estado del Hotel en datos de auditoría. Tenga en cuenta que si se auditó Hotel, se ignorará RelationTargetAuditMode.NOT_AUDITED (tendrá datos históricos para Hotel). @NotAudited significa "simplemente no me importa este campo en los datos históricos" (no se guardará, la relación será nula, no la verá cuando busque datos históricos sobre CustomerBooking )