我们的应用程序项目是一个使用 JPA 和 EclipseLink 和 JTA 的 OSGI 捆绑包,需要单表多租户,其中租户 ID 来自 REST 请求。从我所阅读和尝试的内容来看,这似乎是不可能的:
- 由于租户 ID 会根据请求而变化,因此每个具有新租户 ID 的请求都需要手动创建一个具有相应属性的新
PersistenceContext
(EntityManager
(。 - 但是根据 http://tomee.apache.org/jpa-concepts.html 的说法,使用JTA时无法手动创建持久性上下文(
@PersistenceUnit
不会被注入并且Persistence.createEntityManagerFactory
不起作用(。
我错过了什么吗?或者这真的不可能做到吗?
您可以在实体管理器中为请求设置多租户/鉴别器属性。但是对于多线程和延迟初始化来说并不安全。
我尝试了支持单表多租户的CMobileCom JPA。对于每个租户,应使用新的实体管理器。也就是说,不应共享实体管理器来访问多个租户的数据。EclipseLink 也是如此。
免责声明:我是CMobileCom JPA的开发人员,CMobileCom JPA是Java和Android的轻量级JPA实现。