Учитывая, что вы используете Envers, я бы на самом деле решил полностью отделить этап создания отчета от текущего приложения. Это дает вам несколько преимуществ:
- Транзакции Hibernate не будут включать в себя больше шагов, чем необходимо, поэтому они фиксируются быстрее.
- Разделение задач, генерация отчетов полностью независима.
- Логика повторов становится проще благодаря механизму опроса / нажатия.
Конечно, вы можете свернуть все это в один, но тогда я считаю, что управлять этими точками становится намного сложнее, но решение в конечном итоге остается за вами.
В следующем объясненииЯ собираюсь предположить, что опрос / толчок делается в отдельном приложении. Идея состоит в том, что в это отдельное приложение включены сопоставления сущностей приложения (или, по крайней мере, те, которые представляют интерес).
Во-первых, я хотел бы предложить, чтобы отображение редакции-сущности для REVINFO
также отслеживало измененные типы сущностей. Это будет очень полезно позже при создании отчета, потому что мы можем взять тип объекта в сочетании с номером ревизии и выбрать ревизии на основе этого.
Во-вторых, отдельное приложение предназначено для отслеживания последнегономер ревизии обработан. Каждый раз, когда запускается последовательность опроса / отправки, приложение будет видеть, есть ли какие-либо новые ревизии, и если это так, оно будет их обрабатывать;в противном случае он будет ждать, а затем опросить снова.
Общая идея концепции будет такой:
- Получить все экземпляры объекта ревизии с момента последнего номера ревизии
- Итерациякаждая редакция-сущность и ...
- Для каждого типа сущности, измененного в редакции, извлекать изменение по номеру редакции сущности-редакции
- Для каждого типа сущности, измененного в редакции, извлекать редакциюprior
- Выполните diff двух экземпляров Java (используя что-то вроде JaVers и т. д.)
- После того, как все различия записаны, отправьте отчет в SQS