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);
}

入力セッションは Hibernate セッションです。versionConfig 変数は何らかの方法で提供する必要があります。この Envers 構成オブジェクトは、カスタム リスナーの init 関数で次のように作成できます。

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