当我在Envers拥有自己的监听器时,我还可以使用AuditReader吗?

时间:2013-03-24 11:51:01

标签: java database hibernate hibernate-envers audit-trail

我正在尝试使用Envers进行条件审核,所以根据documentation,我关闭了默认的Envers事件监听器,而是注册了我自己的子类。

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

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

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

1 个答案:

答案 0 :(得分: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);
}

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

public final void initialize(final Configuration configuration) {
    versionConfig = AuditConfiguration.getFor(configuration);
}