[英]Multi-tenancy using single database multiple schema with Hibernate and Spring Boot saving data to wrong schema
[英]Change current schema before using spring data Repository - Multi tenancy
我正在使用一个多租户 Spring Boot Web 应用程序,它从数据库中读取一些数据。
我已经为每个租户模型构建了模式,实现了 MultiTenantConnectionProvider 和 CurrentTenantIdentifierResolver 以根据租户设置连接。 租户使用 ThreadLocal 变量解析,设置在过滤器中(通过扩展 OncePerRequestFilter 构建)。
但是,我需要解决在过滤器中没有获取租户信息的特定情况。 但是,我可以稍后在处理服务中的请求时获取租户信息,但此时实体管理器已设置(似乎由 OpenSessionInViewFilter 查看 spring 源完成)使用默认模式并且我的所有查询都失败了,因为默认架构不包含我需要的数据。
我的问题是,在休眠过滤器已经设置会话之后,如何将实体管理器设置为指向服务级别的租户特定模式? 我可以做任何过滤器(OpenSessionInViewFilter)正在做的事情,如下所示:
EntityManager entityManager = entityManagerFactory.createEntityManager();
TransactionSynchronizationManager.bindResource(entityManager, new EntityManagerHolder(entityManager));
//unbind once I am done using the repositories
但我在想这是否是正确的方法,或者是否还有其他更好、更简单、有记录的方法。
EntityManager entityManager = entityManagerFactory.createEntityManager();
TransactionSynchronizationManager.bindResource(entityManager, new
EntityManagerHolder(entityManager));
以上对我不起作用。 但是,我找到了一种解决方法 - 通过在不同的线程中运行我的任务(我刚刚创建了一个固定的线程池执行程序并提交了我的任务)并在 ThreadLocal 对象中设置了新租户,我能够实现我想要的。 通过正确的 CurrentTenantIdentifierResolver 和 MultiTenantConnectionProvider 实现,建立了与预期租户模式的连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.