首页 > 解决方案 > Fetch Type Eager 不适用于过滤器

问题描述

我正在使用多租户的 Hibernate。多租户通过过滤器和鉴别器列实现(参见https://medium.com/better-programming/how-to-build-a-multi-tenant-application-using-spring-boot-and-hibernate-718e16bfd456

这意味着每个 SQL 查询都使用“... and tenant =?”进行扩展。在 WHERE 子句中

如果我加载一个实体,则会为每个关系执行一个额外的选择。我想将实体加载到一个 SELECT 而不是 n + 1 中。因此我使用 FetchType.EAGER 来建立关系。这在没有多租户和过滤器的情况下工作正常。一旦多租户过滤器处于活动状态,这将不起作用并且实体管理器执行 n+1 选择。

有谁知道这个问题并有解决方法的提示?有更好的多租户处理吗?

对于这个问题,我想避免使用 EntityGraphs(出于各种原因)和 HQL 语句

这是一个小例子https://github.com/MelleD/hibernate-filter-example

没有过滤器的输出是

    select
    foo0_.id as id1_1_0_,
    foo0_.tenant_id as tenant_i2_1_0_,
    bars1_.foo_id as foo_id1_2_1_,
    bar2_.id as bars_id2_2_1_,
    bar2_.id as id1_0_2_,
    bar2_.name as name2_0_2_ 
from
    foo foo0_ 
left outer join
    foo_bars bars1_ 
        on foo0_.id=bars1_.foo_id 
left outer join
    bar bar2_ 
        on bars1_.bars_id=bar2_.id 
where
    foo0_.id=?

带过滤器的输出是:

select
    foo0_.id as id1_1_,
    foo0_.tenant_id as tenant_i2_1_ 
from
    foo foo0_ 
where
    foo0_.tenant_id = ? 
    and foo0_.id=?

select
    bars0_.foo_id as foo_id3_0_0_,
    bars0_.id as id1_0_0_,
    bars0_.id as id1_0_1_,
    bars0_.foo_id as foo_id3_0_1_,
    bars0_.name as name2_0_1_ 
from
    bar bars0_ 
where
    bars0_.foo_id=?

标签: hibernatejpa

解决方案


推荐阅读