[java] 엔티티 관리자가있는 경우 세션 객체를 어떻게 가져올 수 있습니까?

나는 가지고있다

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

entitymanager를 사용하는 경우 세션을 검색하거나 분리 된 기준에서 결과를 어떻게 얻을 수 있습니까?



답변

완전히 철저히 말하자면 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);


답변

Hibernate ORM User Guide의5.1. Accessing Hibernate APIs from JPA ” 섹션을 참조하십시오 .

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


답변

이것은 더 잘 설명 될 것입니다.

EntityManager em = new JPAUtil().getEntityManager();
Session session = em.unwrap(Session.class);
Criteria c = session.createCriteria(Name.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();


답변