这个问题已经讨论here,但是,它没有解决我的问题。
让我们拥有简单的审计类Person,其中包含一些字符串信息,如名称等,以及List of String电子邮件地址。现在我想从数据库中删除特定的人及其所有修订。我知道,这不是Envers的常见用例,但它对我的项目至关重要。我明白,我可以使用这样的东西:
“从full.package.name.Person_AUD中删除u,其中u.originalId.id =:personid”
但是,这并不会删除电子邮件表中与此人相关的记录,因为没有关于此关系的限制。或者我做错了什么?
我还在考虑从REVINFO表中删除记录(审计表中有关于REVINFO表的关系存在约束),但这不安全,因为在一个事务中可以修改更多实体,因此更多实体可以拥有相同的修订号。
我的问题是:有没有简单的方法可以删除任何人的所有审核表中的所有记录?
答案 0 :(得分:1)
这对我来说非常有用,不需要原生查询
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
}
答案 1 :(得分:0)
由于这不是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