从EntityManagerFactory正确使用实体管理器

时间:2012-07-16 23:41:30

标签: java jpa eclipselink entitymanager

在查询对象和/或删除/创建时,我在理解实体管理器的正确用法方面遇到了一些麻烦。对于任何数据库事务,我现在有几种服务方法可以打开和关闭新的实体管理器,如下所示:

public static Long getCountApplicants(String active){

    EntityManager entityManager = factory.createEntityManager();
    long value = (Long) entityManager.createQuery("select count(distinct a) from    Applicant a  where a.active = " +active).getSingleResult();
    System.out.println("get count app query");
    entityManager.close();
    return value;
}

由于我有一个带有persistence.xml文件的Java EE应用程序来定义我的单元,为什么我不能在我的工厂中只声明一个并在我的应用程序的整个生命周期中使用它?仅使用其中一个对象是否存在任何性能或内存泄漏问题?

更新

我正在使用以下堆栈,Spring Framework / JPA Eclipselink

2 个答案:

答案 0 :(得分:2)

长话短说:既然您正在使用Spring,那么最好将实体管理器定义为DAO的属性,如下所示:

@PersistenceContext
EntityManager em;

然后您的代码变为:

public static Long getCountApplicants(String active){
    long value = (Long) em.createQuery("select count(distinct a) from    Applicant a  where a.active = " +active).getSingleResult();
    System.out.println("get count app query");
    return value;
}

这仅适用于非扩展持久性上下文 由Spring注入的EntityManager将是线程安全的 是否需要配置LocalEntityManagerFactorBean应用程序管理的或LocalContainerEntityManagerFactoryBean容器管理的实体管理器只需在Spring配置文件中进行配置。

答案 1 :(得分:1)

在管理应用程序时,EntityManager通常不是线程安全的。

http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html

但是,如果您使用的是容器管理版本,则应该是。你会注射它:

@PersistenceContext
EntityManager entityManager;

Spring是一个可以做到这一点的容器。上面的链接是一个有用的资源。