SE 应用程序中的 JPA:如何在应用程序的生命周期内交换实体管理器



我正在编写一个小型数据库驱动的应用程序,它使用Hibernate作为JPA提供程序。我对Java相当陌生,尽管我选择它作为一个研究项目。

我确实希望任何人都可以引导我正确了解如何在应用程序的整个生命周期中使用 EntityManager。参考休眠手册(2.4.在 Java SE 环境中获取实体管理器(..."实体管理器工厂通常在应用程序初始化时创建,并在应用程序端关闭。" 这是可以理解的。

根据我在JavaFX预加载器中的理解,我应该创建实体管理器,因为初始化需要几秒钟。

我使用了该代码。

EntityManagerFactory emf = Persistence.createEntityManagerFactory("h2")
EntityManager em = emf.createEntityManager();

但是,我怎样才能在整个应用程序中共享该实体管理器?

对此的最佳实践是什么?

谢谢。

您应该创建一次 EntityManagerFactory 实例,最好是单例实例(单例设计模式(并在应用程序中使用它。但是,如果您的服务或存储库中需要 EntityManager 实例,则必须每次都创建 EntityManager。

对于 Java 桌面应用程序,您可以创建如下所示的 JpaUtil 静态方法,并在服务或存储库中使用 JpaUtil 进行数据访问。

package com.cemikta.customersfx.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
/**
* JPA util
*
* @see EntityManagerFactory
* @see EntityManager
*
* @author Cem Ikta
*/
public class JpaUtil {
private final static Logger logger = LoggerFactory.getLogger(JpaUtil.class);
private final static String PERSISTENCE_UNIT = "customersFxPU";
private static EntityManagerFactory emf = null;
private JpaUtil() {}
/**
* Create entity manager factory as singleton instance.
*
* @return entity manager factory from persistence unit
*/
public static EntityManagerFactory getEntityManagerFactory() {
logger.debug("get entity manager factory for persistence unit {}", PERSISTENCE_UNIT);
if (emf == null) {
synchronized (EntityManagerFactory.class) {
if (emf == null) {
emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT);
}
}
}
return emf;
}
/**
* Close the entity manager factory.
*/
public static void closeEntityManagerFactory() {
logger.debug("close entity manager factory for persistence unit {}", PERSISTENCE_UNIT);
if (emf != null) {
emf.close();
}
}
/**
* Gets new entity manager instance.
*
* @return new entity manager instance
*/
public static EntityManager getEntityManager() {
logger.debug("get entity manager for persistence unit {}", PERSISTENCE_UNIT);
return getEntityManagerFactory().createEntityManager();
}
}

如果您需要示例 JPA 实现,请查看我在 JavaFX MVC 应用程序演示源代码中的抽象服务实现。

相关内容

最新更新