📜  JPA-实体管理器(1)

📅  最后修改于: 2023-12-03 15:32:07.899000             🧑  作者: Mango

JPA实体管理器介绍

JPA(Java Persistence API)是JavaEE技术规范中用来管理POJO(Plain Old Java Object)对象的持久性的API。实体管理器(EntityManager)是JPA中用来管理实体类对象的核心组件之一,本篇文章将对实体管理器进行详细介绍。

实体管理器的作用

实体管理器是JPA框架中实现ORM的关键组件之一,主要用于以下工作:

  • 管理实体类对象的生命周期,即实体类对象的持久化状态管理;
  • 实现实体类对象和数据库记录之间的映射,即实体类对象和数据库表的映射;
  • 提供基本的curd操作,即通过实体管理器实现对数据库表中数据的增、删、改、查操作。
  • 支持事务管理,即在执行增、删、改操作时自动开启、提交/回滚事务。
实体管理器的创建

实体管理器的创建需要通过实体管理工厂(EntityManagerFactory)来获得,实体管理工厂是JPA的另一个核心组件。我们可以通过以下代码片段来获取实体管理器:

//创建实体管理器工厂
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnitName");

//获取实体管理器
EntityManager em = emf.createEntityManager();

其中,persistenceUnitName是一个名称,对应着META-INF/persistence.xml文件中的元素name属性的值。

实体管理器的生命周期

实体管理器的生命周期与事务相关,在一个事务中,实体管理器一般和事务绑定在一起,即实体管理器的生命周期和事务的 生命周期是一致的。当事务完成时,实体管理器将被关闭,并被垃圾收集器回收。

实体对象的状态

实体对象有四种状态:

  • 新建状态:即实体对象通过new关键字创建但尚未被持久化到数据库中;
  • 托管状态:即实体对象被持久化到数据库中,并由实体管理器进行管理;
  • 游离状态:即实体对象被从实体管理器中移除,并且此时实体对象对应的数据库记录不再和该实体对象保持同步。
  • 删除状态:即实体对象被标记为删除状态,在事务提交时将从数据库中删除对应记录。
实体对象的操作

通过实体管理器,我们可以对实体对象进行基本CRUD操作,以下是具体实现细节:

新增实体对象
em.persist(entity);
em.flush(); //可选,立即提交到数据库
更新实体对象
em.merge(entity);
em.flush(); //可选,立即提交到数据库
删除实体对象
em.remove(entity);
em.flush(); //可选,立即提交到数据库
查询实体对象
// 根据ID查询实体对象
Entity find(Class<T> clazz, Object id);

// 查询所有实体对象
List<T> findAll(Class<T> clazz);

// 查询实体对象(带条件)
List<T> findByCondition(Map<String, Object> conditions);
实体管理器的优化

实体管理器创建和销毁的开销比较大,我们需要尽可能地减少实体管理器的创建和销毁次数。在实际应用中,通常采用以下两种方式来优化实体管理器的使用:

  1. 采用单例模式,将实体管理器作为全局唯一的对象来使用;
  2. 采用线程绑定策略,即将实体管理器与当前线程绑定,使用完成后及时关闭并回收。
总结

实体管理器是JPA中重要的组件之一,通过使用实体管理器,我们可以方便地实现ORM映射关系,进行CURD操作,支持事务管理等,提高了应用程序的开发效率。