エンティティマネージャーがある場合、セッションオブジェクトを取得するにはどうすればよいですか?


107

私が持っています

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

    return detachedCriteria.getExecutableCriteria("....").list();
}

entitymanagerを使用している場合にセッションを取得するにはどうすればよいですか、または分離された基準から結果を取得するにはどうすればよいですか?


次も参照してください((EntityManagerImpl)em).getSession();
アシュリー2016年

回答:


181

完全に網羅するために、JPA 1.0またはJPA 2.0実装を使用している場合は状況が異なります。

JPA 1.0

JPA 1.0では、を使用する必要がありますEntityManager#getDelegate()。ただし、このメソッドの結果は実装固有であり、Hibernateを使用するアプリケーションサーバーから他のサーバーに移植できないことに注意してください 。たとえば、JBossでは次のようにします。

org.hibernate.Session session = (Session) manager.getDelegate();

しかしGlassFishでは、次のことを行う必要があります。

org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession(); 

私は同意します、それは恐ろしいことです、そして仕様はここで非難することです(十分に明確ではありません)。

JPA 2.0

JPA 2.0では、新しいアプリケーションEntityManager#unwrap(Class<T>)よりも優先される新しい(そしてはるかに優れた)メソッドがありEntityManager#getDelegate()ます。

したがって、JPA 2.0実装としてのHibernate(3.15。Native Hibernate APIを参照)を使用すると、次のようになります。

Session session = entityManager.unwrap(Session.class);

1
entityManager.unwrap(Session.class);何がSession入っSession.classてるの?輸入品ですか?
タンファン

JPA実装によって異なりますが、eclipselinkを使用している場合は、org.eclipse.persistence.sessions.Session
albciffが

41

セクション「を参照してください。JPAから5.1へのアクセスにHibernateのAPIで」休止状態ORMユーザーガイドを

Session session = entityManager.unwrap(Session.class);

entityManager.unwrap(Session.class);何がSession入っSession.classてるの?輸入品ですか?
タンファン

2
Hibernateマニュアルが変更されました。ポイント15.8では、セッションの取得に関する情報は提供されなくなりました。
Nicktar

1
2019年1月の時点でも、Hibernate current(5.3.7)マニュアル、§5.1では、これをSessionオブジェクトへの参照を取得する方法として述べています。
アランベッカー

5

これはよりよく説明します。

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.class);

0

'entityManager.unwrap(Session.class)'は、EntityManagerからセッションを取得するために使用されます。

@Repository
@Transactional
public class EmployeeRepository {

  @PersistenceContext
  private EntityManager entityManager;

  public Session getSession() {
    Session session = entityManager.unwrap(Session.class);
    return session;
  }

  ......
  ......

}

デモアプリケーションリンク


-1

Wildflyで作業していたが、使用していた

org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();

そして正解は

org.hibernate.Session session = (Session) manager.getDelegate();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.