4

Hibernateインターセプターを作成していて、Hibernateセッションオブジェクトにアクセスする必要があります。インターセプターを使用してHibernateセッションに直接アクセスする方法はありますか?

私がやろうとしているのは、Hibernateが接続しているデータベースを見つけることです。さまざまな理由から、これをスレッドローカルデータとして保存することは実用的ではありません。

4

2 に答える 2

4

はい、方法があります...作成後にInterceptorにセッションを渡すだけです:

Session session = factory.openSession(interceptor);
interceptor.setSession(session);

そして、インターセプター内でセッションがあります!覚えておいてください:

  1. Interceptorは、実行中のセッションにアクセスできないため、オブジェクトを変更/追加するために直接使用しないでください。
  2. 同じJDBC接続で一時セッションを開くことができます
  3. トランザクションは両方のセッションで同じになります

    try {    
        Connection connection = mySession.connection();
        Session tempSession = HibernateUtil.getSessionFactory().openSession(connection); 
        // do something
        tempSession.flush(); 
    } 
    finally { 
        tempSession.close(); 
    }
    
于 2012-08-29T11:22:53.457 に答える
0

セッションオブジェクトを取得する「公式の」方法は、どちらを介しても、を介しても存在しo.h.Interceptorないようo.h.EmptyInterceptorです。さらに、InterceptorのJavadocは次のように述べています。

SessionFactoryのInterceptorのインスタンスが1つある場合もあれば、セッションごとに新しいインスタンスが指定されている場合もあります。どちらのアプローチを使用する場合でも、セッションをシリアライズ可能にする場合は、インターセプターをシリアライズ可能にする必要があります。これは、SessionFactoryスコープのインターセプターがreadResolve()を実装する必要があることを意味します。

セッションをコールバックから呼び出すことはできません(また、コールバックによってコレクションまたはプロキシが遅延初期化されることもありません)。

この情報を取得する唯一の方法は、リフレクションを使用することであるように思われ、ここで回答されています。

于 2012-05-24T21:56:22.077 に答える