2012-07-12 18 views
13

Uso Hibernate Envers para auditar mis entidades.¿Cómo no auditar una tabla de unión y entidades relacionadas usando Hibernate Envers?

Tengo una entidad auditada, Foo, que tiene un List<Bar> como propiedades. Sin embargo, no quiero auditar las entidades Bar. Por lo tanto, escribí que:

@Entity 
@Audited 
public class Foo { 

    @JoinTable(name = "T_FOO_BAR", joinColumns = @JoinColumn(name = "FOO_ID"), inverseJoinColumns = @JoinColumn(name = "BAR_ID")) 
    @ManyToMany(cascade = PERSIST) 
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
    public List<Bar> getBars() { 
     return bars; 
    } 

} 

Ahora, quiero recuperar una revisión de Foo:

AuditReader reader = AuditReaderFactory.get(getEntityManager()); 
    Foo revision = (Foo) reader.createQuery().forEntitiesAtRevision(Foo.class, 42).getSingleResult(); 

Por desgracia, cuando quiero recuperar todos los datos (es decir, cuando éste se carga perezosa la bars) , me sale el error ORA-00942: table or view does not exist, ya que trató de consultar:

select ... from T_FOO_BAR_AUD x, T_BAR y where ... 

I sin embargo que el uso de @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED), Hibernate Envers gustaría mantener el enlace s con los Bar elementos de la entidad actual.

Entonces, ¿cómo puedo resolver mi problema, sin tener que auditar explícitamente las tablas T_BAR y T_FOO_BAR (la tabla de unión)? En otras palabras, cuando recupero la lista de bars de mi entidad de revisión, obtengo la lista de bars de mi entidad actual (ya que los enlaces entre Foo y Bar no se auditan).

Gracias.

Respuesta

18

Parece que está usando @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) cuando debería usar @NotAudited en su caso.

RelationTargetAuditMode.NOT_AUDITED simplemente no auditarán la entidad de destino . Todavía intentará auditar la propiedad List<Bar> de Foo y, por lo tanto, la tabla de unión.

A partir de los documentos:

Si desea auditar una relación, cuando la entidad de destino no auditados (que es el caso por ejemplo de las entidades de diccionario-como, que no cambian y no tiene que ser auditado), simplemente anótelo con @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED). Luego, al leer las versiones históricas de su entidad, la relación será apuntando siempre a la entidad relacionada "actual".

Cuestiones relacionadas