Hibernate.org社区文档
JPA 2 是 Java EE 6.0 平台的一部分。在容器如 EJB 3 或更现代化的 CDI(Java Context and Dependency Injection,Java 上下文和依赖注入)中,以及在特定容器外部执行的独立 Java SE 应用程序中,都可以使用 JPA 中的持久性。以下编程接口和构件在两种环境中皆可用。
EntityManagerFactory
一个实体管理器工厂提供实体管理器实例,所有实例都配置为连接到同一数据库,使用特定实现中定义的相同默认设置,等等。你可以准备多个实体管理器工厂以访问多个数据存储。此接口类似于 Hibernate 中的 SessionFactory。
SessionFactory
EntityManager
EntityManager API 用来在特定工作单元中访问数据库。它用来创建和移除持久实体实例,通过它们的 ID 标识查找实体,以及在所有实体上进行查询。此接口类似于 Hibernate 中的 Session。
Session
一个持久性上下是一组实体实例,在此组中,对于任何持久实体标识,都会有一个唯一的实体实例。在持久性上下文中,实体实例及其生命周期由特定实体管理器管理。此上下文的范围可以是事务,或一个扩展的工作单元。
一个给定实体管理器可以管理的实体类型集合由一个持久单元来定义。一个持久单元定义了一组由应用程序关联或分组的所有类,并且在它们映射到一个单一数据存储时,必须使其并置。
一个实体管理器,其生命周期由容器管理。
一个实体管理器,其生命周期由应用程序管理。
一个涉及 JTA 事务的实体管理器。
一个使用资源事务(而不是 JTA 事务)的实体管理器。
Java EE 环境中最普遍且最广泛使用的实体管理器是容器管理实体管理器。在此模式中,容器负责实体管理器的打开和关闭(这对于应用程序来说是透明的)。它也负责事务边界。应用程序可以通过依赖项注入或 JNDI 查找在应用程序中获取一个容器管理实体管理器,容器管理实体管理器需要使用 JTA 事务。
应用程序管理实体管理器允许您在应用程序代码中控制实体管理器。此实体管理器通过 EntityManagerFactory API 检索。应用程序管理实体管理器可以参与当前的 JTA 事务(JTA 实体管理器),也可以通过 EntityTransaction API(资源本地实体管理器)控制事务。资源本地实体管理器事务映射到直接资源事务(即在 Hibernate 的情况下为 JDBC 事务)。在设置实体管理器工厂时,在配置期间定义实体管理器类型(JTA 或资源本地)。
EntityTransaction
实体管理器是与持久化上下文进行交互的 API。可以使用两种常见的策略:将持久化上下文绑定到事务边界,或者保持持久化上下文在多个事务中可用。
最常见的情况是将持久化上下文范围绑定到当前事务范围。只有在使用 JTA 事务时才能这样做:持久化上下文与 JTA 事务生命周期相关联。当调用一个实体管理器时,如果当前 JTA 事务没有关联的持久化上下文,也会打开持久化上下文。否则,将使用关联的持久化上下文。当 JTA 事务完成时,持久化上下文也会结束。这意味着在 JTA 事务期间,应用程序将能够处理同一持久化上下文的托管实体。换句话说,您不必在托管 bean (CDI) 或 EJB 方法调用中传递实体管理器的持久化上下文,而只需在需要实体管理器时使用依赖项注入或查找即可。
您还可以使用扩展持久化上下文。如果您使用容器管理实体管理器,这可以与有状态会话 bean 结合使用:在从依赖项注入或 JNDI 查找中检索实体管理器时创建持久化上下文,并在容器在完成 Remove 有状态会话 bean 方法后关闭它之前一直保留。这是一个实现“长时间”工作模式的完美机制。例如,如果您必须将多个用户交互周期作为一个工作单元来处理(例如,必须完全完成的向导对话框),您通常会从应用程序用户的角度将此建模为一个工作单元,并使用扩展持久化上下文来实现它。有关此模式的更多信息,请参阅 Hibernate 参考手册或《实用 Hibernate》一书。
Remove
JBoss Seam 3 建立在 CDI 的基础上,其核心概念是会话和工作单元的概念。对于应用程序管理的实体管理器,在创建实体管理器时创建持久性上下文,并在关闭实体管理器时保留该持久性上下文。在扩展持久性上下文中,在事务外执行的所有修改操作(持久、合并、删除)都会排队,直到持久性上下文附加到事务中。该事务通常在用户进程结束时发生,以便可以提交或回滚整个进程。对于应用程序管理的实体管理器,仅支持扩展持久性上下文。
用 EntityManagerFactory.createEntityManager()(应用程序管理)创建的资源本地实体管理器或实体管理器与持久性上下文之间为一对一关系。在其他情况下会出现 持久性上下文传播。
EntityManagerFactory.createEntityManager()
持久性上下文传播会出现在容器管理的实体管理器中。
在事务范围的容器管理实体管理器中(Java EE 环境中的常见情况),JTA 事务传播与持久性上下文资源传播相同。换句话说,在给定的 JTA 事务中检索到的容器管理的事务范围的实体管理器都共享相同的持久性上下文。按照 Hibernate 条款,这意味着所有管理者都共享相同的会话。
重要提示:持久性上下文绝不会在不同的 JTA 事务之间或不属于同一实体管理器工厂的实体管理器之间共享。在使用扩展持久性上下文时,上下文传播有一些值得注意的例外
如果具有事务范围持久性上下文的无状态会话 Bean、消息驱动 Bean 或有状态会话 Bean 在同一 JTA 事务中调用具有扩展持久性上下文的无状态会话 Bean,则会抛出 IllegalStateException。
IllegalStateException
如果具有扩展持久性上下文的无状态会话 Bean 在同一 JTA 事务中调用具有事务范围持久性上下文的无状态会话 Bean 或有状态会话 Bean,则会传播持久性上下文。
如果具有扩展持久性上下文的无状态会话 Bean 在不同的 JTA 事务上下文中调用无状态会话 Bean 或有状态会话 Bean,则不会传播持久性上下文。
如果具有扩展持久性上下文的无状态会话 Bean 实例化具有扩展持久性上下文的另一个有状态会话 Bean,则扩展持久性上下文会由第二个有状态会话 Bean 继承。如果第二个有状态会话 Bean 在与第一个有状态会话 Bean 不同的事务上下文中被调用,则会抛出 IllegalStateException。
如果具有扩展持久性上下文的无状态会话 Bean 在同一事务中调用具有不同的扩展持久性上下文的无状态会话 Bean,则会抛出 IllegalStateException。
在 Java SE 环境中,只有受应用管理的扩展上下文实体管理器可用。您可以使用 EntityManagerFactory API 检索实体管理器。只有资源本地实体管理器可用。换句话说,Java SE 中不支持 JTA 事务和持久性上下文传播(您必须自己传播持久性上下文,例如使用 Hibernate 社区流行的线程本地会话模式)。
扩展上下文意味着在检索实体管理器(使用 EntityManagerFactory.createEntityManager(...) )时创建一个持久性上下文,并在关闭实体管理器时将其关闭。在这种情况下,许多资源本地事务共享同一个持久性上下文。
EntityManagerFactory.createEntityManager(...)
版权所有 © 2005 Red Hat Inc. 及众多作者