EntityManager 接口是一个 API,用于管理实体实例的生命周期。
实体不能将其自身持久存储在关系数据库上;注释仅用于将 POJO 声明为实体,或定义它的映射以及与关系数据库上相应表的关系。
在 JPA 中,EntityManager 接口用于允许应用程序管理和搜索关系数据库中的实体。
EntityManager 是一个 API,用于管理实体实例的生命周期。EntityManager 对象会管理由持久性单元定义的一组实体。每一个 EntityManager 实例都与一个持久性上下文相关联。持久性上下文会定义一个作用域,通过 EntityManager 提供的 API 在该作用域内创建、持久存储和移除特定的实体实例。 通过某些方式,持久性上下文在概念上类似于事务上下文。
实体管理器会跟踪对持久性上下文内的所有实体对象所作的更改和更新,并将这些更改刷新到数据库。关闭持久性上下文之后,所有受管实体对象实例将与持久性上下文及其相关联的实体管理器拆离,不再受管。将某个对象从持久性上下文拆离之后,该对象不再受任何实体管理器进行管理,并且对此对象实例所作的任何状态更改都将不与数据库同步。
实体对象实例由实体管理器进行管理(已连接),或者为非受管(已拆离)。
将实体连接至实体管理器时,该管理器会监视该实体的任何更改,并且每当实体管理器确定刷新其状态时,将这些更改与数据库同步。
将某个实体拆离时,该实体将不再与持久性上下文相关联,变为非受管实体,并且实体管理器不会跟踪其状态更改。
当事务作用域或已扩展持久性上下文结束时,实体实例会变为非受管且已拆离。此事实的一个重要影响是可以序列化已拆离的实体并通过网络将其发送至远程客户机。客户机可以远程更改这些已序列化的对象实例,并将其发送回服务器以合并回数据库并与数据库同步。
操作 | 描述 |
---|---|
持久 (persist) |
|
查找 (find) | 获取具有给定持久性身份(主键)的受管实体实例,如果找不到,则返回空值。 |
remove | 从数据库中删除具有给定持久性身份的受管实体。 |
合并 (merge) | 将已拆离实体的状态合并到已拆离实体的受管副本中。所返回的受管实体所具有的 Java 身份与已拆离实体的身份不同。 |
刷新 | 从数据库中重新装入实体状态。 |
锁定 | 设置持久性上下文中所包含的实体对象的锁定方式。 |
flush | 强制与数据库同步。 |
包含 | 确定当前持久性上下文是否包含某个实体。 |
createQuery | 使用动态 Java 持久性查询语言创建查询实例。 |
createNamedQuery | 创建预定义查询的实例 |
createNativeQuery | 创建 SQL 查询的实例。 |
在 Java EE 环境中使用实体管理器的一种方式是通过容器管理的实体管理器。在这种方式下,容器负责实体管理器的打开和关闭,因此也负责持久性上下文的生命周期(以对应用程序透明的方式)。容器管理的实体管理器也负责事务边界。
容器管理的实体管理器在应用程序中通过依赖关系注入或 JNDI 查询进行获取,并且容器以对应用程序透明的方式管理与实体管理器工厂的交互。
容器管理的实体管理器需要使用 JTA 事务,因为其持久性上下文将通过当前 JTA 事务自动进行传播,并且已映射至相同持久性单元的实体管理器引用提供了对 JTA 事务内此相同持久性上下文的访问权。这种由 Java EE 容器执行的持久性上下文的传播表示,应用程序不必将对实体管理器实例的引用从一个组件传递至另一个组件。
使用应用程序管理的实体管理器允许您在应用程序代码中控制实体管理器。