2012-04-12 5 views
0

Ich habe zwei geprüften Stellen, A und B. Unternehmen A besitzt eine Sammlung von Einheit B (kommentierten als One-to-many-Beziehung). Wenn Sie eine neue Instanz von A in die Datenbank einfügen, haben alle Zeilen von A und B dieselbe Revision (sagen wir Revision 1). Dann gibt es ein Update auf A, das nur die Instanzen von Entität B betrifft. Nach der Aktualisierung befindet sich die Entität A immer noch auf Revision 1, während sich die Entitäten von B in Revision 2 befinden (einschließlich eines MOD-Eintrags in der Audit-Tabelle). . In Revision 3 wird die Entität A gelöscht. Da die Sammlung von Entität B mit @Cascade annotiert ist, werden auch die zu A gehörenden Entitäten B gelöscht.Hibernate Envers: Suchen die richtigen Revisionen eines Unternehmens mit einer Sammlung Eigenschaft

dieses Szenario gegeben, wie ich eine Prüfung Abfrage mit Envers erstellen, die 2 eine Instanz von Einheit A mit den aktualisierten Einheiten B Überarbeitungs bekommen? Wenn ich nach allen Revisionen von Entität A frage, erhalte ich entweder die gelöschte Entität von A, die keine Entitäten von B enthält (Revision 3), oder ich bekomme A von Revision 1, die auch B-Entitäten von Revision 1 enthält.

Mit Hibernate 3.6, wenn das hilft.

+0

im Zusammenhang mit http zu bekommen: // Stackoverflow. com/questions/10697945/hibernate-envers-track-revisionen-in-der-besitz-seite-einer-einethnomen-relation und http://stackoverflow.com/questions/10529982/how-to-retrieve-the- audited-revision-of-relations – Jean

Antwort

2

Wenn Sie Entität A in Revision 2 lesen, erhalten Sie die richtigen Daten.

Zur Zeit keine Möglichkeit, eine Liste der Revisionen in denen ein Unternehmen oder verbundene Unternehmen geändert zu bekommen (wie der Fall ist - rev 2 eine Änderung in B ist nur, in einem nicht).

+0

Ich habe versucht, A bei Revision 2 zu bekommen, aber dann ist die Ergebnisliste der Audit-Abfrage leer. Ich nahm dieses Verhalten als korrekt an, da es natürlich keinen Eintrag in der Audit-Tabelle für A mit Revision 2 gibt. –

+1

Hmm, nein, das ist sehr seltsam, bei Revision 2 existierte Entität A. ah!Vielleicht verwenden Sie die falsche Art von Abfrage. Eine besteht darin, Entitäten zu finden, die bei einer bestimmten Revision modifiziert wurden (also wurde bei rev2 A nicht modifiziert), die andere besteht darin, Entitäten zu finden, wie sie bei einer gegebenen rev vorhanden waren (dann existierte A bei rev2). – adamw

+1

Danke, das war es. Die Verwendung von forEntitiesAtRevision() anstelle von forRevisionsOfEntity() löste mein Problem. –

0

in der Ruhe konnten wir die Belastung der Kinder steuern, indem sie faul angeben. Daher müssen Sie die untere Zeile zu Ihrer Klassendefinition in der Hibernate-Konfiguration hinzufügen, damit alle Zuordnungen in beiden Schreib-/Lese-Fällen geladen werden.

<cache usage="read-write"/> 

Wenn Sie CacheMode.REFRESH markiert haben dann wird es Elemente in die Second-Level-Cache schreiben. Lesen Sie nicht aus dem Cache der zweiten Ebene.

Wenn Sie keine Probleme haben, in die Kinder zum Zeitpunkt der Eltern Laden Sie faul machen könnte, welche die aktualisierten Informationen angezeigt werden können.

+0

Sie haben mein Problem nicht verstanden, oder? –

+0

Ich habe versucht, Sinn aus der Frage, aber wenn Sie denken, dass ich es anders herum verstanden habe .. dann können Sie es bitte kurz ausdrücken, wenn möglich. – Phani

1

Ich löste ein ähnliches Problem durch ein verstecktes Lastupdated Datumsfeld Hinzufügen auf meinem Äquivalent Ihrer A Einheit.

@Entity 
public class A { 
    private Date lastModified; 
    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL) 
    private List<B> blist; 
    public void touch(){ 
     lastModified=new Date(); 
    } 
} 

Dann in den verbundenen Unternehmen (wie Sie B-Feld), habe ich die folgenden:

public class B { 
    @ManyToOne 
    private A a; 

    @PreUpdate 
    public void ensureParentUpdated(){ 
     if(a!=null){ 
      a.touch(); 
     } 
    } 
} 

Dies stellt sicher, dass eine Revision A hinzugefügt wird, wenn eine Revision, auch wenn es B hinzugefügt wird erfordert in vielen Entitäten benutzerdefinierten Code.

In Ihrem Fall dies stellt sicher, dass eine Geschichte tatsächlich die Revisionen von B. enthält diese Weise können Sie nur eine Abfrage müssen alle Revisionen für die gesamte A, B Graph

Verwandte Themen