JPA中的EntityManagerFactory是什么?它和EntityManager有什么区别?

JPA中的EntityManagerFactory和EntityManager有以下区别:

EntityManagerFactory:

  1. EntityManagerFactory是一个工厂类,用于创建EntityManager实例。
  2. 应用程序通常只有一个EntityManagerFactory实例。它对应一个数据源和一组映射文件。
  3. EntityManagerFactory是线程安全的,并且成本高昂的资源。应用程序关闭时销毁它。
  4. EntityManagerFactory读取ORM映射文档,并准备与数据库的连接。

EntityManager:

  1. EntityManager用于管理实体实例的生命周期,并实现持久化操作。
  2. 应用程序可以有多个EntityManager实例。通常每个事务对应一个EntityManager实例。
  3. EntityManager不是线程安全的。不同线程应该使用不同的EntityManager实例。
  4. EntityManager代表一个会话,维护着与数据库的连接。当进行持久化操作时,它通过EntityManagerFactory创建的连接来与数据库交互。
  5. EntityManager的生命周期通常较短,用完即关闭。

代码示例:

// 创建 EntityManagerFactory  
EntityManagerFactory emf = Persistence.createEntityManagerFactory("exampleUnit");

// 获取 EntityManager 
EntityManager em1 = emf.createEntityManager();
EntityManager em2 = emf.createEntityManager();

// 使用 EntityManager 进行持久化操作
em1.getTransaction().begin();
// ...  
em1.getTransaction().commit();
em1.close();

em2.getTransaction().begin();  
// ...
em2.getTransaction().commit();
em2.close();

// 关闭 EntityManagerFactory  
emf.close();