2017-02-06 4 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; 
    } 

} 

И вот наш довольно простой класс B.

@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:

  • Commit объект с пустым списком
  • Commit объект с двумя добавленными Bs
  • Объект с одним удаленным 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("f[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 является сущностью и имеет идентификатор. Что мне не хватает?

Редактировать Спасибо, что ответили на комментарии. Возможно, я недостаточно детально. Извини за это.

То, что я пытаюсь запросить, это все изменения на A и все изменения на B. Я только совершаю A, но, возможно, это проблема? Должен ли я отслеживать A и B?

+0

Но ни 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 изменения) является вызовом commitShallowDelete()

Смежные вопросы