2014-09-04 2 views
0

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

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

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

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

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

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

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

Поблагодарите ваши мысли.

ответ

0

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

Теперь, если сущности с разными эффективными датами имеют разные идентификаторы, тогда вы должны просто моделировать его как отдельные объекты, а просто вы JPA.

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

+0

Спасибо, что ответили. –

+0

Когда мы создаем сущности, эффективная дата - это что-то в будущем (+100 лет). Когда сущность модифицируется, мы хотим обновить старую версию с помощью effectiveTo = sysdate-1 и новой версии с эффективнымFrom = sysdate. Это упрощает запрос для объекта на определенную дату, для которой он был эффективным. Это также может быть достигнуто только с эффективностью на стороне, но означает, что запрос намного сложнее. Можно ли обновить предыдущий revsion? –

+0

Нет, ревизии неизменяемы. Но мне кажется, что в вашем случае разные версии объектов имеют разные идентификаторы, поэтому вы должны просто моделировать его как отдельные сущности и запрашивать с помощью JPA. В этом случае Envers не даст вам многого. – adamw