programing

entity-manager가 있는 경우 session 개체를 가져오려면 어떻게 해야 합니까?

newsource 2022. 10. 26. 21:06

entity-manager가 있는 경우 session 개체를 가져오려면 어떻게 해야 합니까?

있습니다

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에서는 를 사용할 필요가 있습니다.단, 이 방법의 결과는 구현에 따라 다릅니다.즉, 애플리케이션 서버에서 다른 서버로 휴지 상태를 사용하여 이식할 수 없습니다.를 들어 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 에서는, 새로운 애플리케이션보다 훨씬 뛰어난 새로운 방법이 있습니다.

즉, 휴지 상태를 JPA 2.0으로 구현한 경우(3.15 참조). 네이티브 휴지 상태 API)는 다음과 같습니다.

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

"5.1" 섹션을 참조하십시오. 휴지 상태 ORM 사용자 가이드의 "JPA에서 휴지 상태 API에 액세스":

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;
  }

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

}

데모 어플리케이션 링크

와일드플라이에서 일하고 있었는데

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

그리고 정답은

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

언급URL : https://stackoverflow.com/questions/4148231/how-can-i-get-the-session-object-if-i-have-the-entity-manager