Данные двухвременного аудита с JPA Envers

У нас есть приложение, которое отслеживает все изменения сущностей с помощью двухвременных данных. Каждая сущность имеет:

@Embeddable 
public class AuditInfo {
    private Date effectiveFrom;
    private Date effectiveTo;
    private Date asOf;
    private Boolean isCurrent;
}

Однако при обновлении объекта мы хотели бы вставить новую запись и обновить старую с помощью isCurrent = false, а также обновить дату EffectiveTo на текущую дату и время.

Могу ли я добиться этого с помощью Spring Jpa-Envers?

Я пробовал подключать перехватчики Hibernate, но позже понял, что могу изменять поля сущностей только внутри перехватчика и больше ничего делать не могу.

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

Другой, с которым мы играем, - это иметь собственный репозиторий и переопределять метод save ().

Был бы признателен за ваши мысли.


person A.U    schedule 04.09.2014    source источник


Ответы (1)


Старые версии сущностей в Envers хранятся в отдельной таблице. Следовательно, флаги как isCurrent не имеют смысла, поскольку в основной таблице содержится текущая версия. Если изменить поля EffectiveTo / EffectiveFrom, новые версии будут вставлены в таблицу аудита.

Теперь, если объекты с разными датами вступления в силу имеют разные идентификаторы, вам следует просто смоделировать их как отдельные объекты, и только ваш JPA.

Если идентичность останется прежней, это отличный вариант использования для Envers.

person adamw    schedule 04.09.2014
comment
Когда мы создаем сущности, фактическая дата - это что-то в будущем (+100 лет). Когда объект изменяется, мы хотим обновить старую версию с EffectiveTo = sysdate-1 и новую версию с EffectiveFrom = sysdate. Это упрощает поиск сущности на заданную дату, между которой она действовала. Этого также можно добиться с помощью только эффективногоFrom сущности, но это означает, что запрос намного сложнее. Можно ли обновить предыдущую ревизию? - person A.U; 04.09.2014
comment
Нет, изменения неизменны. Но мне кажется, что в вашем случае разные версии сущностей имеют разные идентификаторы, поэтому вы должны просто моделировать их как отдельные сущности и запрашивать с помощью JPA. Энверс в этом случае не даст многого. - person adamw; 05.09.2014
comment
Поскольку исторические версии хранятся в отдельной таблице, и когда текущая версия перемещается, должен быть способ подключиться к ней, чтобы изменить данные ревизии? - person A.U; 05.09.2014
comment
Вы можете обойти это, переопределив слушателей Envers, но официального способа сделать это нет. - person adamw; 08.09.2014
comment
Привет, Адам, мне нравится функциональность того, что предоставляет класс ValidityAuditStrategy, но было бы лучше, если бы существовал способ дат для начала-ревизии и конца-ревизии, возможно ли это? - person A.U; 03.10.2014
comment
Даты косвенно хранятся в ревизионных объектах. Вы можете легко получить две ревизии с одинаковой датой. - person adamw; 06.10.2014