2012-07-12 5 views
13

Ich verwende Hibernate Envers, um meine Entitäten zu überprüfen.Wie kann eine Join-Tabelle und zugehörige Entitäten mit Hibernate Envers nicht überprüft werden?

Ich habe eine geprüfte Einheit, Foo, die eine List<Bar> als Eigenschaften hat. Ich möchte jedoch die Bar Entitäten nicht überprüfen. So schrieb ich, dass:

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

} 

Nun, ich eine Revision der Foo abrufen möchten:

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

Leider, wenn ich alle Daten abgerufen werden sollen (dh, wenn es faul Lasten der bars) , erhalte ich die Fehler ORA-00942: table or view does not exist, wie es zur Abfrage versucht:

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

ich aber, dass mit @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED), Hibernate Envers den Link halten würde s mit den Bar Artikeln der aktuellen Einheit. Wie kann ich mein Problem lösen, ohne explizit die Tabellen T_BAR und T_FOO_BAR (die Join-Tabelle) überprüfen zu müssen? In anderen Worten, wenn ich die Liste von bars von meiner Revisionseinheit abrufe, erhalte ich die Liste von bars von meiner aktuellen Entität (da die Verbindungen zwischen Foo und Bar nicht auditiert werden).

Danke.

Antwort

18

Es sieht so aus, als ob Sie @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) verwenden, wenn Sie in Ihrem Fall @NotAudited verwenden sollten.

RelationTargetAuditMode.NOT_AUDITED wird einfach nicht die Zieleinheit auditieren. Es wird weiterhin versuchen, die List<Bar>-Eigenschaft von Foo und damit die Join-Tabelle zu überwachen.

Aus der Dokumentation:

Wenn Sie eine Beziehung überwachen möchten, wo die Zieleinheit ist nicht geprüft (das ist der Fall, zum Beispiel mit Wörterbuch ähnlichen Einheiten, die sich nicht ändern und muss nicht auditiert werden), notieren Sie einfach mit @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED). Wenn Sie dann historische Versionen Ihrer Entität lesen, zeigt die Relation immer auf die "aktuelle" verwandte Entität .