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);
}
入力セッションは Hibernate セッションです。versionConfig 変数は何らかの方法で提供する必要があります。この Envers 構成オブジェクトは、カスタム リスナーの init 関数で次のように作成できます。
public final void initialize(final Configuration configuration) {
versionConfig = AuditConfiguration.getFor(configuration);
}