2017-02-06 3 views
0

현재 JaVers 3.0.0을 사용하고 있습니다. 다음 두 엔티티 A와 B가 있다고 가정하고 A는 목록의 일부 Bs를 추적합니다.목록에서 제거 된 객체를 관찰하십시오

  • 빈 목록 개체를 커밋
  • 객체를 커밋 :

    @Entity 
    @TypeName("A") 
    public class A { 
    
        @Id 
        private int id; 
        private List<B> items; 
    
        public A() { 
         items = new ArrayList<>(); 
        } 
    
        public A(int id) { 
         this(); 
         this.id = id; 
        } 
    
        public int getId() { 
         return id; 
        } 
    
        public void setId(int id) { 
         this.id = id; 
        } 
    
        public List<B> getItems() { 
         return items; 
        } 
    
        public void setItems(List<B> items) { 
         this.items = items; 
        } 
    
    } 
    

    그리고 여기가

    @Entity 
    @TypeName("B") 
    public class B { 
    
        @Id 
        private int id; 
    
        public B() { 
        } 
    
        public B(int id) { 
         this.id = id; 
        } 
    
        public int getId() { 
         return id; 
        } 
    
        public void setId(int id) { 
         this.id = id; 
        } 
    
    } 
    

    유형 A의 객체에 세 가지 변경 사항을 커밋 수 있습니다 우리가 아니라 간단한 클래스 B.이다 두 개의 추가 Bs가있는 경우

  • 하나의 B가 제거 된 커밋 된 개체
  • 내가 B.

    에 변화를 관찰 할 그 후

Javers javers = JaversBuilder 
       .javers() 
       .build(); 

A a = new A(1); 
javers.commit("[email protected]", a); 

a.getItems().add(new B(1)); 
a.getItems().add(new B(2)); 
javers.commit("[email protected]", a); 

a.getItems().remove(0); 
javers.commit("[email protected]", a); 

List<Change> changes = javers.findChanges(
QueryBuilder.byClass(B.class) 
      .build()); 

String changelog = javers.processChangeList(changes, new SimpleTextChangeLog()); 
System.out.println(changelog); 

출력은 제로 변경을 말한다. 나는 B가 엔티티이고 ID가 있기 때문에 제거 된 객체를 볼 것으로 예상하고있었습니다. 내가 뭘 놓치고 있니?

편집 지금까지 의견에 답변 해 주셔서 감사합니다. 어쩌면 나는 충분히 자세하지 않았을지도 모른다. 미안합니다.

쿼리하려고하는 것은 A에 대한 모든 변경 사항과 B에 대한 모든 변경 사항입니다. 단지 A 만 커밋하지만 문제 일 수 있습니까? A와 B를 추적해야합니까?

+0

commitShallowDelete()를 호출하는 것입니다 그러나 아무 B는 변경되지 않습니다. 호기심 대신'A.class'를 시도 했습니까? 아니면 B.setId를 사용 했습니까? 나는 그때 당신이 변경 로그를 얻을 것이라고 확신합니다. – Fildor

+0

@Fildor 사실 하나의 B는 변경되지 않았지만 하나는 A의 목록에서 삭제되었습니다. 나는이 방법으로 찾을 수 있다고 생각했습니다. – raupach

+2

"단일 B는 변경되지 않았지만 하나는 A 목록에서 제거되었습니다." A의 인스턴스를 쿼리해야합니다. 당신이 오직'a'만을 커밋해야한다는 힌트가 있습니다 ... – Fildor

답변

1

javers.compare()javers.commit()은 같은 방식으로 작동하지 않습니다. compare()은 컨텍스트없이 두 개의 개체 그래프를 단순히 비교합니다. 그래프를 비교할 때 변경 목록에서 ObjectRemoved을 기대할 수 있습니다.

그러나 commit()은 감사 변경을위한 것입니다. 두 클래스를 모두 엔터티로 매핑 했으므로이 클래스는 독립적입니다. B 객체는 A 객체가 더 이상 참조하지 않기 때문에 삭제 된 것으로 표시 할 수 없습니다.

삭제 (및 ObjectRemoved 변화를 가지고)로 표시 할 수있는 유일한 방법은