2011-04-14 17 views

Respuesta

26

Utilice 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 buena 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 he tenido 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 de 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).

Oh 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.

+0

Explicación muy útil sobre la anotación RelationTargetAuditMode.NOT_AUDITED. La documentación oficial es realmente horrible en algunos aspectos ... ¡Gracias! –

36

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

Si desea auditar una relación, en los que no se audita la entidad de destino (que es el caso por ejemplo de las entidades de diccionario-similares, que no cambian y no tienen que ser auditado), solo 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".

+0

Conozco su historia antigua pero ... en el caso de la pregunta original, debe usar @NotAudited porque es una relación bidireccional que maneja la entidad objetivo: CustomerBooking. Al menos para JPA 2.1 + Hibernate 4.3.10, @Audited (targetAuditMode = NOT_AUDITED) no funciona en este caso. – pakman

+4

Esta respuesta no explica la diferencia entre NotAudited vs RelationTargetMode.Not_AUDITED. No indica cuándo usar uno sobre el otro. – Ryan

Cuestiones relacionadas