Hibernate Envers: Как удалить записи из моих таблиц аудита?
Этот вопрос уже обсуждался здесь, однако он не решил мою проблему.
Давайте создадим простой проверяемый класс Person с некоторой строковой информацией, такой как имя и т. Д., А также со списком адресов электронной почты. Теперь я хочу удалить конкретного человека из базы данных вместе со всеми ее ревизиями. Я знаю, что это не обычный вариант использования Envers, но это важно для моего проекта. Я понимаю, что я могу использовать что-то вроде этого:
"Удалить из full.package.name.Person_AUD u, где u.originalId.id =:personid"
Однако это не удаляет записи, связанные с этим человеком, в таблице электронных писем, так как нет никаких ограничений в отношении этого отношения. Или я что-то не так делаю?
Я также думал об удалении записи из таблицы REVINFO (в таблицах аудита есть ограничения относительно связи с таблицей REVINFO), но это небезопасно, поскольку в одной транзакции может быть изменено больше сущностей, и, следовательно, большее количество сущностей может иметь одинаковый номер редакции.,
У меня вопрос: есть ли простой способ удалить все записи из всех таблиц аудита для любого человека?
2 ответа
Это полностью работает для меня, и не требуется никаких собственных запросов
AuditQuery aq = auditReader.createQuery()
.forRevisionsOfEntity( ErpEmploye.class, true, false);
aq.add( AuditEntity.id().eq( employe.getCodeId() ) );
aq.add( AuditEntity.relatedId("period").eq( erpPeriod.getCodeId() ) );
List result = aq.getResultList();//parameters must be added, this call is required
if (result.size()>0){
Query query = (Query) PrivateAccessor.invokePrivateMethod( aq, "buildQuery", new Object[0]);
String queryString = (String) PrivateAccessor.getPrivateField( query, "queryString", true );
PrivateAccessor.setPrivateField( query, "queryString", queryString.replace("select e__ from", "delete from"), true );
getDAO().executeQuery(query);//transaction required
}
Так как это не функция, предоставляемая hibernate, и вы удаляете материал самостоятельно; затем вам нужно явно удалить данные из всех таблиц, используя похожие запросы.
delete from full.package.name.Person_AUD u where u.originalId.id = :personid
delete from full.package.name.Emails u where u.personId = :personid