【发布时间】:2018-09-07 11:53:44
【问题描述】:
我们的应用程序项目是一个使用 JPA 与 EclipseLink 和 JTA 的 OSGI 包,并且需要单表多租户,其中租户 ID 来自 REST 请求。从我的阅读和尝试来看,这似乎是不可能的:
- 由于租户 ID 会根据请求而变化,因此每个具有新租户 ID 的请求都需要手动创建具有相应属性的新
PersistenceContext(EntityManager)。 - 但是根据http://tomee.apache.org/jpa-concepts.html,在使用 JTA 时无法手动创建持久性上下文(
@PersistenceUnit不会被注入,Persistence.createEntityManagerFactory不起作用)。
我错过了什么吗?或者这实际上是不可能的?
【问题讨论】:
-
您声明的文档是特定于 TomEE 的 - 大多数其他容器允许您在 JTA 环境中获取 EntityManagerFactory,其中 EntityManagers 参与 JTA 事务。 TomEE 是否不允许使用 transaction-type="JTA" 的 @PersistenceUnit ?
-
我不确定它是否是 EE,我们使用 ServiceMix 作为平台(Apache Karaf OSGI)和 EclipseLink 作为持久性的 JPA 实现。蓝图是将所有这些联系在一起的依赖管理器。
-
所以尝试添加一个@PersistenceUnit 来获取EMF 并自己从中获取EntityManager。如果未正确连接到 JTA,则在事务方法中的某处调用 em.flush 应该会立即引发异常。您可能需要调用 em.joinTransaction。
-
@PersistenceUnit使用 JTA 时未注入注释字段(始终为null)。
标签: jpa eclipselink multi-tenant jta