【发布时间】:2021-02-06 11:51:24
【问题描述】:
JPA 规范定义了两种配置和使用方式:
- 应用程序管理的持久性上下文
- 容器管理的持久性上下文
使用应用程序管理的持久性上下文方法,应用程序代码使用EntityManagerFactory 直接创建EntityManager。使用 Container-managed Persistence Context,容器对此负责。
似乎这一切都只与控制EntityManager 实例(创建、销毁等)有关。
问题是。为什么我们在PersistenceProvider 类中有两种不同的方法? (我的意思是使用不同的参数)
我的意思是这些:
public EntityManagerFactory createEntityManagerFactory(String emName, Map map)public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map)
第一个似乎是应用程序托管类型。它仅适用于persistence.xml 文件,因为它只能采用持久性单元的名称。第二个是容器管理类型。它可以采用PersistenceUnitInfo 对象。为什么我不能将 Application Managed 类型与自定义 PersistenceUnitInfo 参数一起使用?无论如何,这两种变体似乎都适用于容器。差异仅发生在控制EntityManager 实例中。当我们谈论EntityManagerFactory的配置时,这个对象总是驻留在一个容器内,因为我可以用@PersistenceUnit注解注入它。
这看起来很奇怪,因为我仍然可以使用 <jta-data-source> 标记为 Application 托管类型指定数据源。我可以使用 java setter 方法对 Container 托管类型执行相同的操作。如果我能做同样的事情,为什么我在一个变体中只能使用 XML 标记,而我可以在第二个变体中使用 java setter(java 配置)?
【问题讨论】:
标签: java jpa jakarta-ee java-ee-6 java-ee-7