2013-01-16 116 views
0

我正在将JPA-Hibernate应用程序从Java EE 6环境迁移到Tomcat 7环境。Hibernate - EntityManager管理

该应用程序有几个DAO类在EntityManager上进行查询。在Java EE环境中,我可以使用注释@PersistenceContext注入它,并让容器管理EntityManager。现在我必须手动完成,我想知道要走什么路。

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

+0

你是什么意思,从Java EE 6转移到Tomcat 7?你可以说得更详细点吗? – Zutty

+0

应用程序在glassfish上运行,这是一个JEE容器,因此提供@PersistenceContext注入。现在应用程序将运行在不提供此机制的tomcat上。 – kgautron

+0

如果您出于某种原因或其他人想要离开GlassFish,为什么现在要搬到TomEE?这也是Tomcat,但*支持'@ PersistenceContext'。 –

回答

2

不幸的是,你必须手动完成。我通常做的方式是定义一个特殊的类:

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(); 
} 
+0

所以我需要每次访问数据库时创建一个新的EntityManager。那是对的吗? – kgautron

+2

是的。而且,您需要手动处理交易。 – gcvt

相关问题