java - EntityManagerFactory 中实体管理器的正确使用

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

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

更新:

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

最佳答案

长话短说:由于您使用的是 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注入(inject)的EntityManager将是线程安全的。
无论您需要配置 LocalEntityManagerFactorBean 应用程序管理的实体管理器还是 LocalContainerEntityManagerFactoryBean 容器管理的实体管理器,只需在 Spring 配置文件中进行配置即可。

关于java - EntityManagerFactory 中实体管理器的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11514163/

相关文章:

java - 地理位置检索背后的概念

java - 表被指定了两次,既作为 'UPDATE' 的目标,又作为单独的数据源

java - 具有标识符的 Hibernate 可嵌入列表映射

java - Eclipse 不在 JPA 配置中显示 EclipseLink 平台

mysql - 使用乐观锁定检查 JPA 2 中提交时读取集的版本

Java:如何让扫描仪仅匹配第一次出现的情况,如果之前已匹配过则跳过

java - CFX 抛出错误 : "java.io.IOException: HTTPS hostname wrong"

java - 如何在调整大小时重新绘制所有 JPanel?

HibernatePersistence 类未发现 JPA + Hibernate + OSGI 的异常

java - 如何解决从另一个实体 (JPA) 继承的实体的 'no primary key specified'?