2012-07-12 17 views
13

Uso Hibernate Envers per controllare le mie entità.Come non controllare una tabella di join e entità correlate utilizzando Hibernate Envers?

Ho un'entità sottoposta a revisione, Foo, che ha un List<Bar> come proprietà. Tuttavia, non voglio controllare le entità Bar. Così, ho scritto che:

@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; 
    } 

} 

Ora, voglio recuperare una revisione della Foo:

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

Purtroppo, quando ho voglia di recuperare tutti i dati (ad esempio quando viene caricato pigri la bars) , ottengo l'errore ORA-00942: table or view does not exist, mentre cercava di ricerca:

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

ho pensato che l'utilizzo di @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED), Hibernate Envers terrei il link s con gli articoli Bar dell'entità corrente.

Quindi, come posso risolvere il mio problema, senza dover controllare esplicitamente le tabelle T_BAR e T_FOO_BAR (la tabella di join)? In altre parole, quando recupero l'elenco di bars dall'entità di revisione, ottengo l'elenco di bars dall'entità corrente (poiché i collegamenti tra Foo e Bar non vengono verificati).

Grazie.

risposta

18

Sembra che tu stia usando @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) quando dovresti usare @NotAudited nel tuo caso.

RelationTargetAuditMode.NOT_AUDITED semplicemente non controlla l'entità di destinazione . Continuerà a verificare la proprietà List<Bar> di Foo e quindi la tabella di join.

Dalla documentazione:

Se si desidera controllare una relazione, in cui l'entità di destinazione non è controllate (è il caso ad esempio con entità simil dizionario, che non cambiano e non è necessario verificarlo), basta annotarlo con con @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED). Quindi, quando si leggono le versioni storiche della propria entità, la relazione sarà puntare sempre all'entità "corrente" correlata.

Problemi correlati