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


107

나는 가지고있다

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

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


참조((EntityManagerImpl)em).getSession();
애슐리

답변:


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);무엇 SessionSession.class? 수입인가요?
Thang Pham 2011 년

JPA 구현에 따라 eclipselink를 사용하는 경우org.eclipse.persistence.sessions.Session
albciff

41

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

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

entityManager.unwrap(Session.class);무엇 SessionSession.class? 수입인가요?
Thang Pham 2011 년

2
Hibernate 매뉴얼이 변경되었습니다. 포인트 15.8은 더 이상 세션 획득에 대한 정보를 제공하지 않습니다.
Nicktar

1
2019 년 1 월 현재 Hibernate 최신 (5.3.7) 매뉴얼, §5.1은 여전히 ​​이것을 Session 객체에 대한 참조를 얻는 방법으로 명시하고 있습니다.
Alain BECKER

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.