답변:
완전히 철저히 말하자면 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
Hibernate ORM User Guide의 " 5.1. Accessing Hibernate APIs from JPA " 섹션을 참조하십시오 .
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();