Hibernateインターセプターを作成していて、Hibernateセッションオブジェクトにアクセスする必要があります。インターセプターを使用してHibernateセッションに直接アクセスする方法はありますか?
私がやろうとしているのは、Hibernateが接続しているデータベースを見つけることです。さまざまな理由から、これをスレッドローカルデータとして保存することは実用的ではありません。
はい、方法があります...作成後にInterceptorにセッションを渡すだけです:
Session session = factory.openSession(interceptor);
interceptor.setSession(session);
そして、インターセプター内でセッションがあります!覚えておいてください:
トランザクションは両方のセッションで同じになります
try {
Connection connection = mySession.connection();
Session tempSession = HibernateUtil.getSessionFactory().openSession(connection);
// do something
tempSession.flush();
}
finally {
tempSession.close();
}
セッションオブジェクトを取得する「公式の」方法は、どちらを介しても、を介しても存在しo.h.Interceptor
ないようo.h.EmptyInterceptor
です。さらに、Interceptor
のJavadocは次のように述べています。
SessionFactoryのInterceptorのインスタンスが1つある場合もあれば、セッションごとに新しいインスタンスが指定されている場合もあります。どちらのアプローチを使用する場合でも、セッションをシリアライズ可能にする場合は、インターセプターをシリアライズ可能にする必要があります。これは、SessionFactoryスコープのインターセプターがreadResolve()を実装する必要があることを意味します。
セッションをコールバックから呼び出すことはできません(また、コールバックによってコレクションまたはプロキシが遅延初期化されることもありません)。
この情報を取得する唯一の方法は、リフレクションを使用することであるように思われ、ここで回答されています。