2012-08-16 68 views
1

这个问题已经在讨论here,但是,它并没有解决我的问题。Hibernate Envers:如何从我的审计表中删除条目?

让我们来简单的审计类人与一些字符串信息,如姓名等,并与字符串电子邮件地址列表。现在我想从数据库中删除特定的人员及其所有修订版本。我知道,这不是Envers常见的用例,但它对我的项目至关重要。我明白了,我可以使用这样的事情:

然而,这并不会删除:

“PERSONID从full.package.name.Person_AUDü其中u.originalId.id =删除”在电子邮件表中与这个人相关的记录,因为这个关系没有限制。或者我做错了什么?

我也在考虑从REVINFO表中删除记录(在审计表中有关于REVINFO表的约束),但这不是安全的,因为在一个事务中可以有更多的实体被修改,因此更多的实体可能有相同的版本号。

我的问题是:是否有任何简单的方法从任何人的所有审计表中删除所有记录?

回答

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 
+0

不幸的是上面的例子只是简单的例子。我们的实际应用程序要复杂得多,建议的解决方案不易实现。 – ferou 2012-08-17 08:17:22

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    
} 
相关问题