EntityManagerからHibernateSessionオブジェクトを取得することは可能ですか?休止状態の特定のAPIにアクセスしたい...
私はすでに次のようなことを試しました:
org.hibernate.Session hSession =
( (EntityManagerImpl) em.getDelegate() ).getSession();
しかし、EJBでメソッドを呼び出すとすぐに、NullPointerExceptionを伴う「EJBでの呼び出し中にシステム例外が発生しました」というメッセージが表示されます。
Glassfish3.0.1を使用しています
JPA 2では、推奨されるメカニズムは entityManager.unwrap(class) です。
HibernateEntityManager hem = em.unwrap(HibernateEntityManager.class);
Session session = hem.getSession();
実装クラスにキャストしようとしているため(おそらくJDKプロキシを扱っていた)、例外が発生したと思います。インターフェイスにキャストすれば、すべて問題ないはずです(JPA 2バージョンでは、キャストは必要ありません)。
Hibernate EntityManagerのドキュメントから、それを行うための好ましい方法は次のとおりです。
Session session = entityManager.unwrap(Session.class);
単純な:
Session session = (Session) em.getDelegate();
EntityManager
が適切に挿入され(@PersistenceContext
を使用)、nullでない場合、以下が機能するはずです。
org.hibernate.Session hSession = (Session) em.getDelegate();