JPA中的EntityManagerFactory和EntityManager有以下区别:
EntityManagerFactory:
- EntityManagerFactory是一个工厂类,用于创建EntityManager实例。
- 应用程序通常只有一个EntityManagerFactory实例。它对应一个数据源和一组映射文件。
- EntityManagerFactory是线程安全的,并且成本高昂的资源。应用程序关闭时销毁它。
- EntityManagerFactory读取ORM映射文档,并准备与数据库的连接。
EntityManager:
- EntityManager用于管理实体实例的生命周期,并实现持久化操作。
- 应用程序可以有多个EntityManager实例。通常每个事务对应一个EntityManager实例。
- EntityManager不是线程安全的。不同线程应该使用不同的EntityManager实例。
- EntityManager代表一个会话,维护着与数据库的连接。当进行持久化操作时,它通过EntityManagerFactory创建的连接来与数据库交互。
- 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();