Поскольку это DDD, объект значения не должен иметь собственный @Id.
Но Hibernate Envers, похоже, не может правильно отслеживать изменения без первичного ключа.
Когда я обновляю родительский элемент, Envers выдает ошибки например:
ОШИБКА: повторяющееся значение ключа нарушает уникальное ограничение "..._pkey"
ОШИБКА: столбец ... "revend" не существует
Мы попробовали общий обходной путь с @OrderColumn / SETORDINAL, но он не решает проблему — Envers все еще пытается вставить дубликаты для одного и того же (owner_id, rev, setordinal).
Код: Выделить всё
@Entity
@Audited
class ParentEntity {
@Id
private Long id;
@ElementCollection
@OrderColumn(name = "position")
@CollectionTable(name = "parent_values",
joinColumns = @JoinColumn(name = "parent_id"))
private List values = new ArrayList();
}
@Embeddable
@Audited
class ValueObject {
private String propertyA;
private Integer propertyB;
// equals/hashCode implemented based on all fields
}
- Использование @OrderColumn, чтобы Envers имел стабильный ключ
- Добавлен целочисленный порядковый столбец (позиция), аналогичный обходному пути, описанному здесь:
Аудит @ElementCollection/@Embeddable с помощью hibernate-envers - Правильное значение /hashCode на ValueObject (@EqualsAndHashCode)
- Список вместо Set (поскольку Set потерял порядок в БД)
- Использование ValidityAuditStrategy
Или Envers фундаментально полагаться на технический идентификатор для аудита коллекций в рамках ValidityAuditStrategy?
Любой реальный работающий пример или рекомендуемая альтернатива дизайна приветствуется.
Подробнее здесь: https://stackoverflow.com/questions/798 ... without-id
Мобильная версия