gpt4 book ai didi

spring-boot - 在 Spring JPA 中应用 Multi-Tenancy 通用标准的最佳实践?

转载 作者:行者123 更新时间:2023-12-04 10:53:43 24 4
gpt4 key购买 nike

我正在构建一个具有多个租户(即客户)的企业应用程序 (SaaS)。同一功能的不同客户之间的数据存储在同一张表中,我使用名为“site_id”的列来定义数据的所有权。它看起来像这样:

PurchaseOrder:
- int id
- int site_id
- String product_name
- int quantity

在每个请求中,过滤器都会处理 session 信息以确定该用户可以访问哪个站点。此数据存储在静态线程局部变量中,该变量可以从名为 Set<Integer> RequestSiteScope.getSiteIds() 的静态方法中检索到。 .

现在,对于自动创建的存储库的“findAll”查询,它们也将返回其他客户的数据。

例如,现在我有一个这样的界面
public interface PurchaseOrderRepository implements CrudRepository<PurchaseOrder, int> {
List<PurchaseOrder> findAll();
}

我正在处理来自我知道只能访问 site_id 的用户的请求3,4。我想让 findAll仅使用 site_id in (3, 4) 返回数据标准。 SQL 应该类似于 select * from purchase_order where site_id in (?, ?);带参数 3, 4 .

当然,我可以手动创建每个查询以始终添加 where site_id = ?条款,但这不仅乏味,而且很容易被我 future 的队友遗忘。我查看了 @Query注释,但它无济于事,因为我无法将动态变量(site_id)放入其中。

有没有办法可以更改负责神奇地实现这些存储库方法的 Spring 逻辑,以便我可以注入(inject)我的 where以编程方式带有动态信息(来自线程局部类静态变量)的子句?

这个概念有点像 Ruby on Rails ActiveRecord scope概念,带有 lamda flavor 。理想情况下,所有涉及带有“site_id”的表的查询都将自动包含此条件,除非涉及某些特殊过程(功能 block 注释禁用此)。

到目前为止,我一直在研究这些选项,但还没有决定结果:
  • 规范执行者 ( Spring Boot & JPA: Implementing search queries with optional, ranged criteria )
  • AOP 拦截器 ( https://www.baeldung.com/hibernate-interceptor )


  • 更新:本文提供了Spring中 Multi-Tenancy 的所有三种解决方案: https://medium.com/swlh/multi-tenancy-implementation-using-spring-boot-hibernate-6a8e3ecb251a

    最佳答案

    Spring Data JPA 在这里无能为力。通常您正在寻找 Hibernate Multitenancy .具体来说,您正在寻找 discriminator column multitenancy .但我认为即使是我最新的 Hibernate 版本 it's not yet implemented .

    或者,您可以使用 @Filter 推出自己的解决方案注解:

    @FilterDef(
    name = "tenantFilter",
    parameters = @ParamDef(name = "tenant", type = "int")
    )
    @Filter(
    name = "tenantFilter",
    condition = "tenant_id = :tenant"
    )
    public class BaseEntity implements Serializable {

    关于spring-boot - 在 Spring JPA 中应用 Multi-Tenancy 通用标准的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59332205/

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