私が持っています
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria("....").list();
}
entitymanagerを使用している場合にセッションを取得するにはどうすればよいですか、または分離された基準から結果を取得するにはどうすればよいですか?
私が持っています
private EntityManager em;
public List getAll(DetachedCriteria detachedCriteria) {
return detachedCriteria.getExecutableCriteria("....").list();
}
entitymanagerを使用している場合にセッションを取得するにはどうすればよいですか、または分離された基準から結果を取得するにはどうすればよいですか?
回答:
完全に網羅するために、JPA 1.0またはJPA 2.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では、新しいアプリケーションEntityManager#unwrap(Class<T>)
よりも優先される新しい(そしてはるかに優れた)メソッドがありEntityManager#getDelegate()
ます。
したがって、JPA 2.0実装としてのHibernate(3.15。Native Hibernate APIを参照)を使用すると、次のようになります。
Session session = entityManager.unwrap(Session.class);
entityManager.unwrap(Session.class);
何がSession
入っSession.class
てるの?輸入品ですか?
org.eclipse.persistence.sessions.Session
セクション「を参照してください。JPAから5.1へのアクセスにHibernateのAPIで」休止状態ORMユーザーガイドを:
Session session = entityManager.unwrap(Session.class);
entityManager.unwrap(Session.class);
何がSession
入っSession.class
てるの?輸入品ですか?
'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;
}
......
......
}
デモアプリケーションリンク。
Wildflyで作業していたが、使用していた
org.hibernate.Session session = ((org.hibernate.ejb.EntityManagerImpl) em.getDelegate()).getSession();
そして正解は
org.hibernate.Session session = (Session) manager.getDelegate();
((EntityManagerImpl)em).getSession();