gpt4 book ai didi

java - 如何使用 JPA/EclipseLink 实现动态 Multi-Tenancy 或动态表过滤?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:19 25 4
gpt4 key购买 nike

我有一个需要管理的 JavaEE 6、JPA 2.1 应用程序用户属于多个租户。这是必需的,以便他们例如能够将数据的所有权从一个租户更改为另一个。

租户结构以层次化的方式建立,遵循一棵树像这样的实现(格式是 [Role:Tenant-ID] for引用):

                [SysAdmin:1]
/ \
/ \
/ \
/ \
/ \
[Admin Tenant A:2] [Admin Tenant B:3]
/ \ \
/ \ \
[User TA:4] [Manager TA:5] [User TB:6]
\
\
[User TA:7]

现在,当我使用 Activity 用户 [User TA:4] 查询数据库时,我期待带有“tenant-id”的结果 4. 当我查询 Activity 用户时[Admin Tenant B:3] 我希望结果来自租户 3 和 6 以及当我以 [SysAdmin:1] 查询时,我只想返回所有数据基本上没有过滤器。

因为我有 EclipseLink 2.5.1 作为 JPA 实现,所以我尝试使用@Multitenant 首先实现,这显然不是似乎可以正常工作,因为它预计一次只为一个租户工作只有,这非常有意义,因为它正在使用该信息实际上也写入数据库。

对于写入数据库,我想我可以设法得到一些东西按照自定义 @Produces @MultitenantWriteAware
EntityManager
方法的事情,我在这里分配eclipselink.tenant-id 写入目标租户操作。然而,使用这种方法你会失去漂亮的容器管理 @PersistenceContext (CMT) 就像你 @Inject 你的EntityManager 然后。

当尝试使用自定义 PersistenceProvider 实现时搭载在一个 EclipseLink 上,我尽可能地遇到问题不从任何地方检索 Activity 用户。通过它的唯一方法信息似乎是通过

中提供的 Map
public
EntityManagerFactory
createContainerEntityManagerFactory(PersistenceUnitInfo info, Map properties)

我还研究了 QueryRedirector,它似乎可以让我自定义查询并将“AND tenant_id IN (2,3,4)”之类的条件附加到主动查询,这是一种有点手动的实现方式(multi) @Multitenant,但我也无法正常工作那个 ExpressionBuilder 并没有走得太远,而且似乎无法从某处查询该活跃用户。

我想我忽略了一些东西,因为我认为一定有一种通用和自动的方式来实现这一点,而不是手动使用CriteriaBuilder

是否有关于如何实现此目的的任何建议/提示/链接/最佳实践什么样的设置?

最佳答案

我认为到目前为止这是一个悬而未决的问题。我已经发布了一个类似的 question .一个答案包含 link对于也提出这一点的 Eclipse 错误跟踪器。描述的解决方法是对具有不同 Multi-Tenancy 设置的相同表使用多个持久性单元。根据您使用的 EntityManagerFactory,数据库查询具有不同的范围。我没有在实践中使用过它(我害怕这两个持久性单元中存在潜在的不一致)。

我正在尝试使用描述 here 的不同方法与@AdditionalCriteria。我将该注解添加到应由租户过滤但也应可由管理员访问的所有实体:

@AdditionalCriteria(":ADMINACCESS = 1 or this.tenant=:TENANT")

标志 ADMINACCESS 决定是否应用租户过滤器。我想您可以轻松地将其扩展到您的场景。这样可以保证始终应用此动态过滤器。但是您需要自己处理租户属性。对我来说,这是一个很好的妥协。我将所有数据库操作封装在一个点中。以统一的方式实现这一目标的一种方法是记住 ThreadLocal EntityManager 中的当前租户,并确保所有与租户相关的实体都实现一个定义方法 setTenant(String tenant) 的接口(interface) TenantSpecific。如果您持久化新对象,这将始终被设置。

关于java - 如何使用 JPA/EclipseLink 实现动态 Multi-Tenancy 或动态表过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22639513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com