Hibernate Envers:如何从我的审计表中删除条目?

Posted

技术标签:

【中文标题】Hibernate Envers:如何从我的审计表中删除条目?【英文标题】:Hibernate Envers : How to delete entries from my audit tables? 【发布时间】:2012-08-13 01:27:16 【问题描述】:

这个问题已经在here 讨论过,但是并没有解决我的问题。

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

“从 full.package.name.Person_AUD u 中删除 u.originalId.id = :personid”

但是,这不会删除电子邮件表中与此人相关的记录,因为此关系没有限制。还是我做错了什么?

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

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

【问题讨论】:

【参考方案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             

【讨论】:

【参考方案2】:

由于这不是 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

【讨论】:

不幸的是,上面的例子只是简单的例子。我们的实际应用要复杂得多,建议的解决方案也不容易实施。

以上是关于Hibernate Envers:如何从我的审计表中删除条目?的主要内容,如果未能解决你的问题,请参考以下文章

如何不使用 Hibernate Envers 审计连接表和相关实体?

在 Spring Hibernate java 项目中使用“Envers”审计表

使用 Hibernate Envers 进行审计

仅生成 Hibernate Envers 的审计表

Hibernate Envers 管理的审计表的主键是啥?

Hibernate Envers - 在启动时填写审计表