Spring 启动 Hibernate 模式多租户动态租户

Spring boot Hibernate Schema Multitenancy Dynamic Tenant

我正在尝试使用 Hibernate 在我的 Web 应用程序中设置模式多租户。 我已经学习了一些教程并且我来到了: 实现我自己的 MultiTenantConnectionProvider
实现我自己的 CurrentTenantIdentifierResolver
实施 TenantContext 更改 HibernateConfig

我有一个默认的 public 模式和每个租户的一些模式(public 模式有一个 table 与所有租户) .
简而言之,我现在要做的是:

  1. 通过API、
  2. 接收tenantId
  3. 查询 public.tenants table 并控制租户是否启用
  4. 如果启用租户,从他的架构中查询某个table

现在我一直在从 public 更改为租户架构。

现在有用的是修改方法MultiTenantConnectionProvider.getConnection,以便在执行查询之前设置租户,然后直接从上下文中获取租户。 Example

在那种情况下,我没有使用 tenantIdentifier 参数,但我尝试直接从上下文中获取租户。 仅当我不首先查询 public 模式而只是设置租户并在租户模式上执行查询时它才有效。

如果我先在 public 模式上执行查询然后更改租户,我的解决方案将不再有效,因为 spring 对两个查询使用相同的连接。

你有什么建议吗?

因此,对于任何感兴趣的人,我都找到了解决方案。该问题记录在 2015 年的 this 票证中。您无法在同一会话中更改租户。
我发现的解决方法是创建一个新线程,在那里设置您的租户,然后执行您的 CRUD 服务。
如果您不想这样做,我找到了另一种方法:

Session session = entityManager.unwrap(Session.class);
    session.doWork(new Work() {
        @Override
        public void execute(Connection connection) throws SQLException {
            connection.setSchema(schemaName);
            operationService.create(newOperation);
        }
    });

这样您就可以使用同一个会话,因此它全部由 Hibernate 管理,您只需手动更改架构。