Hibernate Envers: как удалить записи из моих таблиц аудита?

Этот вопрос уже обсуждался здесь, однако , это не решило мою проблему.

Пусть у нас есть простой проверенный класс Person с некоторой строковой информацией, такой как имя и т. д., и со списком адресов электронной почты String. Теперь я хочу удалить конкретного человека из базы данных вместе со всеми его версиями. Я знаю, что это не обычный вариант использования Envers, но это важно для моего проекта. Я понимаю, что я могу использовать что-то вроде этого:

"удалить из full.package.name.Person_AUD u, где u.originalId.id = :personid"

Однако это не удаляет записи, связанные с этим человеком, в таблице адресов электронной почты, поскольку для этого отношения нет ограничений. Или я что-то не так делаю?

Я также думал об удалении записи из таблицы REVINFO (в таблицах аудита есть ограничения на отношение к таблице REVINFO), но это небезопасно, так как в одной транзакции может быть изменено больше объектов, и, следовательно, больше объектов может иметь один и тот же номер версии. .

Мой вопрос: есть ли простой способ удалить все записи из всех таблиц аудита для любого человека?


person ferou    schedule 16.08.2012    source источник


Ответы (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             
}
person Nassim MOUALEK    schedule 20.04.2014

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

 delete from full.package.name.Person_AUD u where u.originalId.id = :personid

 delete from full.package.name.Emails u where u.personId = :personid
person Bharat Sinha    schedule 16.08.2012
comment
К сожалению, приведенный выше пример — это всего лишь простой пример. Наше реальное приложение намного сложнее, и предлагаемое решение непросто реализовать. - person ferou; 17.08.2012