Спящий режим включает неверно измененный флаг в списке

#java #spring #hibernate-envers

#java #весна #hibernate-envers

Вопрос:

Я использую Envers для аудита своих данных, и иногда значение _MOD неверно. Он остается 0 вместо 1 , когда я добавляю элемент в свой список. Но это происходит только в конкретном случае.

Моя сущность:

 @Entity
@Table(name = "PERSONNE")
@Audited(withModifiedFlag = true)
public class PersonEntity {

   @Id
   @Column(name = "ID_PERSONNE")
   private Long id;

   @Column(name = "NAME", length = 100)
   private String name;

   @Audited( withModifiedFlag = true, modifiedColumnName = "SERVICES_MOD")
   private Set<PersonneServiceEntity> services = new HashSet<>(); // Entity with attributs, gettters, setters and envers annotations...

   @Audited( withModifiedFlag = true, modifiedColumnName = "OPT_INS_MOD")
   private Set<OptinEntity> optIns = new HashSet<>();// Entity with attributs, gettters, setters and envers annotations...

  
   // more fields
   //   getters, setteurs, equals, tostring
  

мой сервис:

 // personFromDB is retrieve via an Id 
private void update(PersonEntity personFromRequest, PersonEntity personFromDB) {

    personFromDB.setName(personFromRequest.getName());
    updateServices(personFromRequest, personFromDB); // add new support to the list
    updateOptins(personFromRequest, personFromDB); // add new services to the list

    personDao.saveAndFlush(personFromDB);
}
  

Это было волшебство: когда я обновляю name , services и optIns . Все значения в моей базе данных верны, моя сущность правильно сохранена, за исключением одного столбца envers: OPT_INS_MOD ( OPT_INS_MOD == 0 ).
Но если я не обновляю имя (прокомментированная строка), тогда все правильно сохраняется, включая все _MOD значения ( OPT_INS_MOD == 1 и SERVICES_MOD ).
И, наконец, если я переключаюсь updateSupport(personFromRequest, personFromDB) и updateServices(personFromRequest, personFromDB) , в этом случае OPT_INS_MOD правильно, но нет SERVICES_MOD .

Я предполагаю, что существует проблема, когда Envers получает все измененные поля. Потому что для меня это не имеет никакого смысла.

Есть идеи? Я использую Envers версии 4.3.11.Final

Ответ №1:

Я не уверен, что это вам поможет, потому что это не похоже на ту же проблему, но я заметил странность с измененными флагами и коллекциями.

Я получаю свои объекты обратно из интерфейса, преобразованные из JSON обратно в POJOs. Чтобы избежать ошибки переходного объекта в режиме гибернации, мне нужно сбросить значение в поле @Id (которое никогда не отправлялось в FE). Это отлично работает для объектов 1-1.

В collections я обнаружил, что если я создаю новый экземпляр класса collection и заполняю его обновленными объектами из старой коллекции, а затем присваиваю этой новой коллекции старый атрибут, измененный флаг устанавливается в true .

Однако, если я заполню новую коллекцию обновленными объектами, очистите () старую коллекцию, затем добавьте все элементы в новую коллекцию, измененный флаг будет false, если в коллекции не было фактических изменений.