我有一个JavaEE 6,JPA 2.1应用程序,我需要管理 用户属于多个租户。这是必需的,因此它们是 ,例如可以将一个承租人的数据所有权更改为另一个承租人 。如何使用JPA/EclipseLink实现动态多租户或动态表过滤?
租户结构分层方式设置,下面一棵树 像执行这样的(格式为[Role:Tenant-ID]
为 参考):
[SysAdmin:1]
/ \
/ \
/ \
/ \
/ \
[Admin Tenant A:2] [Admin Tenant B:3]
/\ \
/ \ \
[User TA:4] [Manager TA:5] [User TB:6]
\
\
[User TA:7]
现在,当我与活动用户[User TA:4]
查询数据库我 与'tenant-id'预期结果4.当我查询与活动用户 [Admin Tenant B:3]
我期望结果来自租户3和6和 当我查询为[SysAdmin:1]
我只想要返回所有数据 基本上没有过滤器。
由于我有作为JPA实现我试图利用 在@Multitenant
实现首先,这显然不 似乎因为预计在同一时间只 ,这使得单个租户上班工作的EclipseLink 2.5.1完美的意义,因为它正在使用该信息,以及 actualy写入数据库。
对于写来,我想我可以设法相处的定制@Produces @MultitenantWriteAware EntityManager
方法去的东西,在这里我分配 eclipselink.tenant-id
到目标租户写 操作线的东西 数据库。用这种方法,你会丢失漂亮的容器 托管@PersistenceContext
(CMT)@Inject
你的 EntityManager
然后。
当试图用一个自定义PersistenceProvider
是 捎带上一个的EclipseLink提供我所面临的问题,因为我可以 没有从任何地方获取活跃用户实现这一点。只有这样,才能传递 信息似乎是通过提供Map
在
public
EntityManagerFactory
createContainerEntityManagerFactory(PersistenceUnitInfo info, Map properties)
我也看了成QueryRedirector
S的似乎让我定制 查询并追加像“条件,并tenant_id IN(2, 3,4)'变成 积极的查询,这是实施 (多)@Multitenant
的某种手动方式,但我不能得到那个工作,因为我 没有得到与那ExpressionBuilder
和另外似乎 无法从某处查询该活动用户。
我觉得我忽略的东西,我想一定是通用的,自动的方式排序 实现这个,而不是手动 使用 CriteriaBuilder
附加额外条件,查询是否有任何建议/提示/链接/最佳做法如何实现这种 种类的设置?
这样,当您使用此批注连接表时,可以禁用共享高速缓存。当JPA查询缓存时,您是否知道如何设置附加条件? – Orbita