裹集合对象
我有以下实体:裹集合对象
public class ComplexEntity {     public List<TenderLocation> tenderList; 
    public ComplexEntity(List<TenderLocation> tenderList) { 
     this.tenderList = tenderList; 
    } 
} 
public class TenderLocation { 
    public String location; 
    public List<TenderAirline> tenderAirlines; 
    public TenderLocation(String location, List<TenderAirline> tenderAirlines) { 
     this.tenderAirlines = tenderAirlines; 
     this.location = location; 
    } 
} 
public class TenderAirline { 
    public int ID; 
    public String name; 
    public TenderAirline(int ID, String name) { 
      this.ID = ID; 
      this.name = name; 
    } 
} 
而下面的测试用于比较两个ComplexEntiey:
public class ComplexObjectGraphComparisonExample {     @Test 
     public void shouldCompareTwoComplexObjects() { 
      // given 
      Javers javers = JaversBuilder.javers().build(); 
      // Construct test data 
      // ComplexEntity: 
      // - List<TLocation> 
      // TLoation: 
      //  - location: String 
      //  - List<TAir> 
      //  TAir: 
      //   - int ID 
      //   - String Name 
      int locations = 3; 
      List<TenderLocation> tenderLocationsBase = new ArrayList<TenderLocation>(locations); 
      List<TenderLocation> tenderLocationsRef = new ArrayList<TenderLocation>(locations); 
      for (int j = 0; j < locations; ++j) { 
       int airlines = 10; 
       List<TenderAirline> tenderAirlinesBase = new ArrayList<TenderAirline>(airlines); 
       List<TenderAirline> tenderAirlinesRef = new ArrayList<TenderAirline>(airlines); 
       for (int i = 0; i < airlines; ++i) { 
        tenderAirlinesBase.add(new TenderAirline(i, "Airline" + i)); 
        tenderAirlinesRef.add(new TenderAirline(i, "Airline" + i)); 
       } 
       tenderLocationsBase.add(new TenderLocation("BV" + j, tenderAirlinesBase)); 
       tenderLocationsRef.add(new TenderLocation("BV" + j, tenderAirlinesBase)); 
      } 
      ComplexEntity baseEntity = new ComplexEntity(tenderLocationsBase); 
      ComplexEntity referenceEntity = new ComplexEntity(tenderLocationsRef); 
      // when 
      Diff diff = javers.compare(baseEntity, referenceEntity); 
      assertThat(diff.getChanges()).hasSize(0); 
      // Change a single small thing 
      referenceEntity.tenderList.get(1).location = "Difference_1"; 
      // then there is a single change detected 
      diff = javers.compare(baseEntity, referenceEntity); 
      assertThat(diff.getChanges()).hasSize(1); 
      // there should be one change of type {@link ValueChange} 
      ValueChange change = diff.getChangesByType(ValueChange.class).get(0); 
      assertThat(change.getPropertyName()).isEqualTo("location"); 
      assertThat(change.getLeft()).isEqualTo("BV1"); 
      assertThat(change.getRight()).isEqualTo("Difference_1"); 
      // do another change 
      referenceEntity.tenderList.get(1).tenderAirlines.get(1).name = "Difference_2"; 
      // second difference is not detected, failing the commented test 
      diff = javers.compare(baseEntity, referenceEntity); 
      assertThat(diff.getChanges()).hasSize(2); 
      System.out.println(diff); 
     } 
} 
在比较我的第二个变化是没有确定,因为compare方法没有深入比较我的列表。
我已经在这里
http://www.atetric.com/atetric/javadoc/org.javers/javers-core/1.3.4/org/javers/core/Javers.html
阅读,如果我"wrap collections in some Value Objects"深比较集合是可能的。
我的问题是,我怎样才能将我的收藏包裹到Value Objects?
回答:
你可以用像下面的对象的东西:
public class Wrapper     { 
     private final WrappedObject obj; 
     public Wrapper (WrappedObject obj) 
     { 
     this.obj = obj; 
     } 
    } 
回答:
什么是错误的,你的代码是映射,你没有做到这一点的。
public class TenderLocation {     @Id 
    public String location; 
    ... 
public class TenderAirline { 
    @Id 
    public int ID; 
    public String name; 
    ... 
否则,JaVers你的类映射为Value Objects(无身份对象),让你有限的差异经历:你应该使用@Id注释Entities映射你的实体。
以上是 裹集合对象 的全部内容, 来源链接: utcz.com/qa/261749.html




