Hibernate Envers - получить ревизии и объекты между датами - PullRequest
0 голосов
/ 03 января 2019

Рассмотрим автомобиль с контрактами, изменениями, техническим обслуживанием, дилерами и т. Д. Когда в контракте есть обновление, вы найдете revision_id и revision_timestemp , и если вы перейдете к contract_aud, вы можете найти по reivsion_id новую версию.

Моя цель - предоставить конечному пользователю запрос, по которому он может спросить: какие автомобили (во множественном числе) имели ревизии между startDate и endDate. Обратите внимание, что пересмотр может быть в контракте / обслуживании / дилере и т. Д. (А меня интересуют только идентификаторы автомобиля)

Из того, что у меня есть сегодня, можно запросить по дате следующим образом:

    AuditReader auditReader = AuditReaderFactory.get(em);
    AuditQuery q = auditReader.createQuery().forRevisionsOfEntity(Car.class, false, true);
    q.add(AuditEntity.revisionProperty("timestamp").ge(startDate.getTime()));
    q.add(AuditEntity.revisionProperty("timestamp").lt(endDate.getTime()));

Но вы можете заметить, что я отправляю Car.class , и если изменение было внесено в ' контракт ', мне нужно будет отправить Contract.class (и позже получить идентификационный номер автомобиля)

У меня более 20 таблиц с постфиксом _AUD, поэтому нет смысла 20 раз переходить на базу данных.

Вопрос: как можно запросить ревизию, произошедшую между датами и номером ревизии, и объект , который был изменен.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Классический подход заключается в написании простого оператора SQL с левым соединением, который предоставляет дату и ревизию для каждой таблицы.Целью является исключительно получение идентификаторов CAR без каких-либо интерпретаций.

SELECT ri.revision_id, ri.revision_timestamp, s.id supplier_id ...
from revinfo as ri 
left join ...
left join... 
where ri.revision_timestamp 
between 1546530449341 and 1546532280293

бритва Оккама; -)

0 голосов
/ 03 января 2019

Вы можете попробовать использовать аннотацию @ModifiedEntityNames в вашей редакции.

Эта ссылка содержит некоторые детали (она не проиндексирована, найдите аннотацию, вы ее найдете).

Использовать аннотацию не так просто, потому что она изменяет сущность ревизии, которую вы используете (даже если она предоставлена ​​по умолчанию или выполнена на заказ).

Он создаст коллекцию, связанную с каждой ревизией, и в этой коллекции будут содержаться имена сущностей, которые были изменены в соответствующей ревизии.

Имея это в виду, вы можете запрашивать ревизии в заданном временном окне и таблицы, которые были изменены. Позже вы можете использовать метку времени ревизии, чтобы изменить каждую сущность в транзакции.

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

...