3

私は、guice-persist の下で tomcat と hibernate で実行されている guice-servlet を持つ環境を使用しています。私が遭遇した問題は、1 つのリクエストで em.getReference() を使用すると、読み込まれたプロキシ オブジェクトがエンティティ マネージャーのキャッシュに残り、DB からオブジェクトが完全に読み込まれると予想される別のリクエストに表示される可能性があることです。

以前は、デフォルトの動作である EJB3 環境で休止状態を使用していました。エンティティ マネージャのキャッシュは、新しいリクエストごとにクリアされます。guice-persist がリクエストごとにセッションをクリアする方が安全な動作ではないでしょうか? または、少なくとも JpaPersistModule の設定として指定しますか?

EJB3 の動作を担当する hibernate SessionImpl "autoClear" には特別なフラグがあります。新しいエンティティ マネージャーが JpaPersistModule によって作成されているときにフラグを有効にする方法はありますか?

4

1 に答える 1

3

このように解決しました: JpaPersistService によって返された EntityManager をキャッチする AOP インターセプターを作成しました。

bindInterceptor(Matchers.subclassesOf(PersistService.class),
        Matchers.returns(Matchers.identicalTo(EntityManager.class)),
        new EntityManagerInterceptor()
);

インターセプター内で、EntityManagerImpl を介して SessionImpl を取得し、autoClearプロパティを設定しています。

public Object invoke(MethodInvocation invocation) throws Throwable {
    Object result = invocation.proceed();
    if (result instanceof EntityManagerImpl) {
        EntityManagerImpl castedEm = (EntityManagerImpl) result;
        ((SessionImpl) castedEm.getSession()).setAutoClear(true);
    }
    return result;
}
于 2012-02-05T21:06:15.160 に答える