有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果我有entitymanager,如何获取会话对象?

我有

private EntityManager em;

public List getAll(DetachedCriteria detachedCriteria)   {

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

如果使用entitymanager,如何检索会话,或者如何从分离的条件中获得结果


共 (5) 个答案

  1. # 1 楼答案

    请参阅Hibernate ORM User Guide中的“5.1.从JPA访问Hibernate API”一节:

    Session session = entityManager.unwrap(Session.class);
    
  2. # 2 楼答案

    “整个经理。unwrap(Session.class)用于从EntityManager获取会话

    @Repository
    @Transactional
    public class EmployeeRepository {
    
      @PersistenceContext
      private EntityManager entityManager;
    
      public Session getSession() {
        Session session = entityManager.unwrap(Session.class);
        return session;
      }
    
      ......
      ......
    
    }
    

    演示应用程序link

  3. # 3 楼答案

    完全详尽地说,如果使用JPA1.0或JPA2.0实现,情况就不同了

    JPA 1.0

    在JPA1.0中,您必须使用^{}。但请记住,这种方法的结果是特定于实现的,即使用Hibernate无法从应用服务器移植到其他应用服务器。例如with JBoss你会做:

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

    但是with GlassFish,你必须做:

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

    我同意,这太可怕了,这要归咎于规范(不够清楚)

    JPA 2.0

    在JPA2.0中,对于新的应用程序,有一种新的^{}方法比^{}更好

    因此,使用Hibernate作为JPA 2.0实现(参见3.15. Native Hibernate API),您可以:

    Session session = entityManager.unwrap(Session.class);
    
  4. # 4 楼答案

    我在Wildfly工作,但我在使用

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

    正确的答案是

    org.hibernate.Session session = (Session) manager.getDelegate();
    
  5. # 5 楼答案

    这将更好地解释

    EntityManager em = new JPAUtil().getEntityManager();
    Session session = em.unwrap(Session.class);
    Criteria c = session.createCriteria(Name.class);