2017-03-08 2 views
-1

Using Javers 3.0.2, Ich muss Sammlungen von komplexen Objekten verschachtelte Felder in einem Objekt zu vergleichen, manchmal kann es sogar Liste von Elementen innerhalb einer anderen Liste von Elementen und so weiter. Ich verwende Levenshtein Listenvergleich, und es erfordert Objekt der Liste, Feld als Id definiert zu haben. Ich bin in Ordnung, Id-Feld für erforderliche Objekte zu definieren, aber Problem eines solchen Ansatzes ist, dass ich den vollständigen Pfad des geänderten Objekts im Hierarchiediagramm nicht verstehen kann. Im Idealfall möchte ich das gleiche Verhalten wie für Entitäten haben, aber Id muss genauso generiert werden wie für ValueObjects. Irgendwelche Ideen, wie dieses Problem zu lösen, sind sehrJavers Sammlung Vergleich mit Details über Eltern

geschätzt
+0

Bitte klären Sie hinterfragen, setzen einige Beispiel –

Antwort

0

So Fall, dass ich zu beschreiben, ich versuche folgt

class A { 
    @Id 
    private String field0; 
    private List<B> bList; 
} 
class B { 
    @Id 
    private String field1; 
    private String field2; 
    private List<C> cList; 
} 
class C { 
    @Id 
    private String field3; 
    private String field4; 
} 

Und ich brauche 2 Objekte der Klasse A. zu vergleichen, das verstehe ich haben adäquater Vergleich der Sammlungen mit dem Levensteing-Algorithmus Ich muss eine @Id-Annotation für B- und C-Klassen durchführen. Aber in diesem Fall habe ich zum Beispiel Änderungen wie C @ field3 # field4 erhalten, aber ich kann nicht sagen, zu welchem ​​B-Objekt C-Objekt gehört. Daher kann ich keine Hierarchie von geänderten Objekten wie A-> bList [1] -> cList erstellen. 2]

Bei valueobjects ich habe vollständigen Pfad von Änderungen, aber es ist nicht möglich, valueobjects als Elemente von Sammlungen

0

Sie sollten verwendet A auch als Entity zuordnen. Gib es eine ID.

+0

Also, ich dieses Beispiel geändert haben, aber tatsächlich Ergebnis ist das gleiche - Wenn Benutzer cList-Feld (zum Beispiel) ändert, in einem solchen Ansatz kann ich nicht Pfad von cList-Objekt finden -> B -> A – Denis

0

Sie einen Pfad von ValueObjectId.getFragment() extrahieren kann

class A { 
    @Id 
    private String id; 
    private List<B> bList; 
} 
class B { 
    private String field1; 
    private String field2; 
    private List<C> cList; 
} 
class C { 
    private String field3; 
    private String field4; 
} 

def "should "(){ 
    given: 
    def a = new A(id:1, bList: [new B(cList: [new C(field3: 'a')])]) 
    def b = new A(id:1, bList: [new B(cList: [new C(field3: 'b')])]) 

    when: 
    def javers = JaversBuilder.javers().build() 
    def diff = javers.compare(a, b) 
    println diff.prettyPrint() 

    then: 
    true 
} 

Ausgang:

Diff: 
1. ValueChange{globalId:'org.javers.core.cases.StackCase$A/1#bList/0/cList/0', property:'field3', oldVal:'a', newVal:'b'} 
+0

Ja, ich habe diesen Ansatz zunächst versucht. Der Sammlungsvergleich erzeugt in diesem Fall jedoch zu viele Change-Objekte. Er kann Elemente der Collection nicht effektiv vergleichen, wenn deren Indizes geändert wurden. Deshalb habe ich angefangen, die Verwendung von Id und Entitäten zu testen, und so kam ich mit dieser Frage – Denis

Verwandte Themen