0

我正在尝试使用 Envers 进行条件审核,因此根据文档,我关闭了默认的 Envers 事件侦听器,而是注册了我自己的子类。

现在我正在尝试使用 AuditReader 读取审计表,但它会引发异常,说明 Envers(默认)侦听器未正确注册。

如果我只在某些情况下打开/关闭审核,我还能以某种方式使用默认审核阅读器吗?我没有更改表,也没有在我的侦听器中手动做任何事情,我只是检查一些条件,然后从超类调用方法。

更新: 事实证明,要使 AuditReader 工作,侦听器需要实现 EnversListener 接口。问题解决了。

4

1 回答 1

0

事实证明,Envers 尝试从分配给 Hibernate 会话的侦听器中读取 AuditReader。如果您的后插入侦听器未实现 AuditEventListener,则需要手动构建 AuditReader。这就是我在我们的解决方案中实现它的方式,大致基于 Envers 实现:

private AuditReader getAuditReader(final Session session) {
    SessionImplementor sessionImpl;
    if (!(session instanceof SessionImplementor)) {
        sessionImpl = (SessionImplementor) session
                .getSessionFactory().getCurrentSession();
    } else {
        sessionImpl = (SessionImplementor) session;
    }

    return new AuditReaderImpl(this.versionConfig, session, sessionImpl);
}

输入会话是一个休眠会话。需要以某种方式提供 versionConfig 变量。这个 Envers 配置对象可以在您的自定义侦听器的 init 函数中创建,如下所示:

public final void initialize(final Configuration configuration) {
    versionConfig = AuditConfiguration.getFor(configuration);
}
于 2013-04-12T08:32:48.167 回答