实体管理器

EntityManager 接口是一个 API,用于管理实体实例的生命周期。

实体不能将其自身持久存储在关系数据库上;注释仅用于将 POJO 声明为实体,或定义它的映射以及与关系数据库上相应表的关系。

在 JPA 中,EntityManager 接口用于允许应用程序管理和搜索关系数据库中的实体。

EntityManager 是一个 API,用于管理实体实例的生命周期。EntityManager 对象会管理由持久性单元定义的一组实体。每一个 EntityManager 实例都与一个持久性上下文相关联。持久性上下文会定义一个作用域,通过 EntityManager 提供的 API 在该作用域内创建、持久存储和移除特定的实体实例。 通过某些方式,持久性上下文在概念上类似于事务上下文。

实体管理器会跟踪对持久性上下文内的所有实体对象所作的更改和更新,并将这些更改刷新到数据库。关闭持久性上下文之后,所有受管实体对象实例将与持久性上下文及其相关联的实体管理器拆离,不再受管。将某个对象从持久性上下文拆离之后,该对象不再受任何实体管理器进行管理,并且对此对象实例所作的任何状态更改都将不与数据库同步。

受管实体和非受管实体

实体对象实例由实体管理器进行管理(已连接),或者为非受管(已拆离)。

将实体连接至实体管理器时,该管理器会监视该实体的任何更改,并且每当实体管理器确定刷新其状态时,将这些更改与数据库同步。

将某个实体拆离时,该实体将不再与持久性上下文相关联,变为非受管实体,并且实体管理器不会跟踪其状态更改。

当事务作用域或已扩展持久性上下文结束时,实体实例会变为非受管且已拆离。此事实的一个重要影响是可以序列化已拆离的实体并通过网络将其发送至远程客户机。客户机可以远程更改这些已序列化的对象实例,并将其发送回服务器以合并回数据库并与数据库同步。

注: 此行为与 EJB 2.1 实体模型不同,后者中的实体始终由容器进行管理。因为在 EJB 3.0 中,您要处理属于 POJO 的实体,所以这可以简化您设计 Java™ EE 应用程序的方式,原因是不会强制您在业务逻辑层(会话 Bean)与持久性层之间使用模式,例如数据传输对象 (DTO)。

实体管理器操作

可由实体管理器执行的主要操作:
表 1. 实体管理器操作. 该表描述了实体管理器操作。
操作 描述
持久 (persist)
  • 将新的实体实例插入到数据库中。
  • 保存实体的持久性状态以及所拥有的任何关系引用。
  • 该实体实例变为受管实体。
查找 (find) 获取具有给定持久性身份(主键)的受管实体实例,如果找不到,则返回空值。
remove 从数据库中删除具有给定持久性身份的受管实体。
合并 (merge) 将已拆离实体的状态合并到已拆离实体的受管副本中。所返回的受管实体所具有的 Java 身份与已拆离实体的身份不同。
刷新 从数据库中重新装入实体状态。
锁定 设置持久性上下文中所包含的实体对象的锁定方式。
flush 强制与数据库同步。
包含 确定当前持久性上下文是否包含某个实体。
createQuery 使用动态 Java 持久性查询语言创建查询实例。
createNamedQuery 创建预定义查询的实例
createNativeQuery 创建 SQL 查询的实例。

容器管理的实体管理器

在 Java EE 环境中使用实体管理器的一种方式是通过容器管理的实体管理器。在这种方式下,容器负责实体管理器的打开和关闭,因此也负责持久性上下文的生命周期(以对应用程序透明的方式)。容器管理的实体管理器也负责事务边界。

容器管理的实体管理器在应用程序中通过依赖关系注入或 JNDI 查询进行获取,并且容器以对应用程序透明的方式管理与实体管理器工厂的交互。

容器管理的实体管理器需要使用 JTA 事务,因为其持久性上下文将通过当前 JTA 事务自动进行传播,并且已映射至相同持久性单元的实体管理器引用提供了对 JTA 事务内此相同持久性上下文的访问权。这种由 Java EE 容器执行的持久性上下文的传播表示,应用程序不必将对实体管理器实例的引用从一个组件传递至另一个组件。

容器管理的持久性上下文可能已定义为具有以下两种不同作用域中的一种:
  • 事务持久性作用域
  • 已扩展的持久性作用域

应用程序管理的实体管理器

使用应用程序管理的实体管理器允许您在应用程序代码中控制实体管理器。

使用此类应用程序管理的实体管理器时,请注意以下事项:
  • 使用应用程序管理的实体管理器时,不会将持久性上下文传播至应用程序组件,并且实体管理器实例的生命周期由该应用程序进行管理。这表示持久性上下文不会通过 JTA 事务在特定持久性单元中的实体管理器实例之间进行传播。
  • 实体管理器及其相关联的持久性上下文由应用程序显式创建和破坏。
这种类型的实体管理器用在以下两种不同的场景中:
  • 在 Java SE 环境中(您要在该环境中访问独立的持久性上下文,并且不在给定持久性单元的实体管理器引用之间随 JTA 事务进行传播)。
  • 在 Java EE 容器内(当您要获取对实体管理器生命周期的细颗粒度控制时)。
指示主题类型的图标 概念主题
信息中心的条款和条件 | 反馈

时间戳记图标 最近一次更新时间: 2014 年 4 月 17 日

文件名:c_entity_manager.html