事实证明,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);
}