spring boot hibernate模式多租户动态租户

fcy6dtqo  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(529)

我正在尝试使用hibernate在我的webapp中设置模式多租户。我已经学习了一些教程,现在我想到了:实现我自己的multitenantconnectionprovider
实现我自己的currenttenantidentifierresolver
实现tenantcontext更改hibernateconfig
我有一个默认的公共模式和每个租户的一些模式(公共模式有一个包含所有租户的表)。
简而言之,我现在要做的是:
通过api接收租户ID,
查询public.tenants表并控制是否启用了租户
如果启用了租户,则从其架构中查询某个表
现在,我被困在从公共模式到租户模式的转变中。
现在有效的方法是修改multittenantconnectionprovider.getconnection方法,以便在执行查询之前设置租户,然后直接从上下文获取租户。例子
在这种情况下,我不使用tenantidentifier参数,而是尝试直接从上下文中获取租户。只有在我不首先查询公共模式,而只是设置tenant并对tenant模式执行查询时,它才能工作。
如果我先在公共模式上执行一个查询,然后更改租户,我的解决方案就不起作用了,因为spring对两个查询使用相同的连接。
你有什么建议吗?

hk8txs48

hk8txs481#

所以对于任何感兴趣的人,我找到了一个解决办法。这个问题记录在这张2015年的罚单中。不能在同一会话中更改租户。
我找到的解决方法是创建一个新线程,在那里设置租户,然后执行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管理,您只需手动更改模式。

相关问题