Java 持久性 API (JPA) 体系结构
数据持久性是指在应用程序执行之间维护数据的能力。 对于企业应用程序而言,由于需要访问关系数据库,因此持久性至关重要。 为此环境开发的应用程序必须自行管理持久性或使用第三方解决方案,以使用持久性来处理数据库更新和检索。 Java™ Persistence API (JPA) 提供了用于管理 EJB 规范的持久性和对象关系映射和函数的机制。
JPA 规范在内部定义了对象关系映射,而不依赖于特定于供应商的映射实现。 JPA 基于适用于 Java EE 环境的 Java 编程模型,但 JPA 可以在 Java SE 环境中运行以测试应用程序功能。
- EntityManager API 可以持久保存、更新、检索或移除数据库中的对象。
- EntityManager API 和对象关系映射元数据可处理大多数数据库操作,而不需要您编写 JDBC 或 SQL 代码来维护持久性。
- JPA 提供了查询语言,对独立 EJB 查询语言进行了扩展(扩展后的语言又称为 JPQL),您可以使用 JPQL 来检索对象,而不必针对您所使用的数据库编写 SQL 查询。
JPA 设计为在 Java Enterprise Edition (Java EE) 容器内部和外部运行。 当您在容器中运行 JPA 时,应用程序可使用该容器来管理持久性上下文。 如果没有容器管理 JPA,那么应用程序必须自行管理持久性上下文。 为容器管理的持久性设计的应用程序不需要这么多的代码实现即可处理持久性,但这些应用程序无法在容器外部使用。 管理自己的持久性的应用程序可以在容器环境或 Java SE 环境中运行。
- 持久性单元
- 由声明式元数据组成,该元数据向关系数据库描述实体类对象的关系。 EntityManagerFactory 使用此数据创建可通过 EntityManager 来访问的持久性上下文。
- EntityManagerFactory
- 用来为数据库交互创建 EntityManager。 应用程序服务器容器通常提供此功能,但如果您使用的是 JPA 应用程序管理的持久性,那么 EntityManagerFactory 是必需的。 EntityManagerFactory 的实例表示持久性上下文。
- 持久性上下文
- 定义应用程序当前正在操作的一组活动实例。 可手动或通过注入来创建持久性上下文。
- EntityManager
- 该资源管理器维护应用程序正在使用的活动实体对象集合。 EntityManager 处理对象关系映射的数据库交互和元数据。 EntityManager 的实例表示持久性上下文。 容器中的应用程序可以通过注入应用程序或通过在 Java 组件名称空间中查找应用程序来获取 EntityManager 。 如果由该应用程序管理它自己的持久性,那么将从 EntityManagerFactory 获取 EntityManager。注意: 仅以下工件支持 EntityManager 的注入:
- EJB 3.x 会话 Bean
- EJB 3.x 消息驱动的 Bean
- Servlet、Servlet 过滤器和侦听器
- 实现接口 javax.servlet 的 JSP 标记处理程序。 jsp.tagext.Tag 和 javax.servlet.jsp.tagext.SimpleTag
- JavaServer Faces (JSF) 受管 Bean
- 应用程序客户机的主类
- 实体对象
- 一个简单的 Java 类,它以最简单的形式表示数据库表中的行。 实体对象可以是具体类,也可以是抽象类。 它们通过使用属性或字段来维护状态。
Java Persistence API 和本地事务上下文
WebSphere 对受管组件同时提供了全局事务上下文和本地事务上下文。 无论事务是全局事务上下文 (GTC) 还是具有为受管组件提供服务的线程的本地事务上下文 (LTC) ,该事务始终处于活动状态。 虽然此活动事务不会影响应用程序管理的持久性上下文 (即,通过 EntityManager工厂通过 @PersistenceUnit注入到应用程序中获取的 JPA EntityManagers ) ,但它会影响容器管理的持久性上下文 (即,通过 @PersistenceContext注入的 JPA EntityManagers )。
JPA API 方法在 GTC 边界外调用时抛出 TransactionRequired异常,并且仍按预期抛出异常。 但是,当 LTC 保持活动状态 (直到启动新的 GTC 或达到组件服务调用结束) 时,容器管理的事务 (CMT) 持久性上下文也保持活动状态。 保持活动状态意味着由 LTC 边界内的 CMT EntityManager 访存的实体仍由该持久性上下文管理,而不是立即拆离。 与某些 JPA 编程指南相比,此行为可能会使一些人感到意外。 但是,一旦 GTC 开始, LTC 保持活动的持久性上下文将被处置,然后由该持久性上下文管理的实体将被拆离。