Spring 启动 Hibernate 模式多租户动态租户
Spring boot Hibernate Schema Multitenancy Dynamic Tenant
我正在尝试使用 Hibernate 在我的 Web 应用程序中设置模式多租户。
我已经学习了一些教程并且我来到了:
实现我自己的 MultiTenantConnectionProvider
实现我自己的 CurrentTenantIdentifierResolver
实施 TenantContext
更改 HibernateConfig
我有一个默认的 public 模式和每个租户的一些模式(public 模式有一个 table 与所有租户) .
简而言之,我现在要做的是:
- 通过API、
接收tenantId
- 查询 public.tenants table 并控制租户是否启用
- 如果启用租户,从他的架构中查询某个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 管理,您只需手动更改架构。
我正在尝试使用 Hibernate 在我的 Web 应用程序中设置模式多租户。
我已经学习了一些教程并且我来到了:
实现我自己的 MultiTenantConnectionProvider
实现我自己的 CurrentTenantIdentifierResolver
实施 TenantContext
更改 HibernateConfig
我有一个默认的 public 模式和每个租户的一些模式(public 模式有一个 table 与所有租户) .
简而言之,我现在要做的是:
- 通过API、 接收tenantId
- 查询 public.tenants table 并控制租户是否启用
- 如果启用租户,从他的架构中查询某个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 管理,您只需手动更改架构。