Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate-实体管理器管理_Java_Hibernate_Jpa_Entitymanager - Fatal编程技术网

Java Hibernate-实体管理器管理

Java Hibernate-实体管理器管理,java,hibernate,jpa,entitymanager,Java,Hibernate,Jpa,Entitymanager,我正在将JPA Hibernate应用程序从JavaEE6环境迁移到Tomcat7环境 应用程序有几个DAO类在EntityManager上进行查询。在JavaEE环境中,我可以使用@PersistenceContext注释注入它,并让容器管理EntityManager。现在我必须手动操作,我想知道该怎么做 实体管理器是否应该是唯一的?如果是这样的话,它可以是一个静态final字段,在启动时创建,并且每个DAO类都使用它吗?它是否有一个包括关闭然后重新打开的生命周期?不幸的是,您必须手动操作。我

我正在将JPA Hibernate应用程序从JavaEE6环境迁移到Tomcat7环境

应用程序有几个DAO类在
EntityManager
上进行查询。在JavaEE环境中,我可以使用
@PersistenceContext
注释注入它,并让容器管理
EntityManager
。现在我必须手动操作,我想知道该怎么做


实体管理器是否应该是唯一的?如果是这样的话,它可以是一个
静态final
字段,在启动时创建,并且每个DAO类都使用它吗?它是否有一个包括关闭然后重新打开的生命周期?

不幸的是,您必须手动操作。我通常的做法是定义一个特殊类:

public class EMF {
  private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("name");

  public static EntityManager getEntityManager() {
    return factory.createEntityManager();
  }
}
因此,每次需要EntityManager时,都必须手动创建它。您还需要处理事务:

EntityManager em = EMF.getEntityManager();
EntityTransaction et = em.getTransaction();
try {
  MyEntity my = new MyEntity();
  et.begin();
  try {
    em.persist(my);
    et.commit();
  } catch (Exception ex) { 
    if (et.isActive())
      et.rollback();
  }
} finally {
  em.close();
}

从JavaEE6迁移到Tomcat7是什么意思?你能说得更具体一点吗?应用程序是在glassfish上运行的,glassfish是一个JEE容器,因此提供了@PersistenceContext注入。现在,应用程序将在tomcat上运行,而tomcat不提供这种机制。如果出于某种原因您想离开GlassFish,为什么现在要转到TomEE?这也是Tomcat,但支持
@PersistenceContext
。因此每次访问数据库时,我都需要创建一个新的EntityManager。对吗?