#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, если в коллекции не было фактических изменений.