【问题标题】:EclipseLink (JPA) table-based multitenancy with JTA, how?EclipseLink (JPA) 基于表的多租户与 JTA,如何?
【发布时间】:2018-09-07 11:53:44
【问题描述】:

我们的应用程序项目是一个使用 JPA 与 EclipseLink 和 JTA 的 OSGI 包,并且需要单表多租户,其中租户 ID 来自 REST 请求。从我的阅读和尝试来看,这似乎是不可能的:

  1. 由于租户 ID 会根据请求而变化,因此每个具有新租户 ID 的请求都需要手动创建具有相应属性的新 PersistenceContext (EntityManager)。
  2. 但是根据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


【解决方案1】:

您可以在实体管理器中为请求设置多租户/鉴别器属性。但是多线程和惰性初始化并不安全。

我尝试了支持单表多租户的CMobileCom JPA。对于每个租户,应该使用一个新的 EntityManager。也就是说,不应共享 EntityManager 来访问多个租户的数据。 EclipseLink 也是如此。

免责声明:我是CMobileCom JPA 的开发人员,这是一个适用于 Java 和 Android 的轻量级 JPA 实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-22
    • 2014-05-03
    • 2014-04-24
    • 2014-04-07
    • 2020-02-02
    • 1970-01-01
    • 2012-03-31
    • 2013-01-23
    相关资源
    最近更新 更多