2012-08-16 66 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    
} 
相關問題