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
Другие вопросы по тегам