How to enable Multitenancy with Spring Data Jpa
背景:我正在构建一个多租户 SaaS 应用程序,并选择了单一数据库、共享模式作为多租户方法。每个表都有一个鉴别列"tenantId"来隔离租户数据。我使用 Spring Boot 作为应用程序框架,并将 Spring Data JPA 用于数据层,并将 Hibernate 作为 JPA 提供程序。我真的很喜欢 spring 数据有助于消除样板代码的方式,并且目前已经对如下所示的存储库进行了编码,
1 2 3 4 | @Repository public interface UserRepository extends JpaRepository<User,Long>{ } |
以及下面的服务,
1 2 3 4 5 6 7 | public class UserService{ @Autowired private UserRepository userRepo; public User getUser(){ User user = userRepo.findOne(id); } } |
问题陈述:当我想获取用户时,我想获取特定组织的用户。我想知道如何添加租户标准,我不想编写自定义存储库实现,因为这会引入样板代码。
尝试的解决方案:
i) Hibernate Interceptor - onPrepareStatememt:这没有用,因为 sql 是一个字符串,我不想进行字符串操作。
ii) 使用 Spring AOP 启用hibernate过滤器:使用 @Filter 注释实体并尝试在会话中设置过滤器。这不起作用,因为从不调用方面。
1 2 3 4 5 6 | @AfterReturning(pointcut ="execution(* org.hibernate.jpa.internal.EntityManagerImpl.OpenSession(..))", returning ="session") public void forceFilter(JoinPoint joinPoint, Object session) { Session hibernateSession = (Session) session; session.enableFilter("tenantFilter") } |
hibernate 过滤器听起来像是一种很有前途的方法,但我在尝试提出一个可行的解决方案时有点碰壁。我想知道是否有另一种方法可以在 Spring 数据在内部用于查询数据的会话中启用hibernate过滤器。
我在博客上写过关于使用 Spring Boot、JPA、Hibernate 和 Postgres 的多租户应用程序,即使我采用了每个租户的 DB 方法,
看看