12.5. Jakarta Persistence EntityManager

Jakarta Persistence 实体管理器代表与持久上下文的连接。您可以使用实体管理器从持久上下文定义的数据库读取并写入数据库。

持久性上下文通过 javax.pers istence 软件包中的 Java 注释 @Persistence Context 提供。实体管理器通过 Java 类 javax.persistence.EntityManager 提供。在任何受管 Bean 中,实体管理器 实例都可以注入,如下所示:

示例:实体管理器注入

@Stateless
public class UserBean {
    @PersistenceContext
    EntityManager entitymanager;
    ...
}

12.5.1. application-Managed EntityManager

应用管理的实体管理器提供对底层持久性提供商 org.hibernate.jpa.HibernatePersistenceProvider 的直接访问。应用程序管理的实体管理器的范围从应用创建并持续到应用关闭的时间。您可以使用 @PersistenceUnit 注释将持久性单元注入 javax.persistence.EntityManagerFactory 接口,该界面返回应用管理的实体管理器。

当您的应用需要访问特定持久性单元中不通过 Jakarta Transactions 实例传播的持久性上下文时,可以使用应用管理 的实体管理器。在这种情况下,每个实体 管理器 实例都会创建一个新的隔离持久性上下文。您的应用程序将明确创建和销毁 实体管理器 实例及其关联的 PersistenceContext。当您无法直接注入实体管理器实例时,也可使用应用管理 的实体管理器,因为 实体管理器 实例不是线程安全。EntityManagerFactory 实例是 thread-safe。

示例:应用程序管理的实体管理器

@PersistenceUnit
EntityManagerFactory emf;
EntityManager em;
@Resource
UserTransaction utx;
...
em = emf.createEntityManager();
try {
    utx.begin();
    em.persist(SomeEntity);
    em.merge(AnotherEntity);
    em.remove(ThirdEntity);
    utx.commit();
}
catch (Exception e) {
    utx.rollback();
}