关于hibernate:如何使用Spring Data Jpa启用多租户 | 珊瑚贝

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过滤器。

  • 显然,AOP 将不起作用,因为切入点永远不会匹配… EntityManagerFactory 用于获取 EntityManager 而不是 Session,它是 createEntityManager。返回的 EntityManager 可以被 unwrap 编辑为 Session 以启用过滤器。但是,启用它后,您还必须将正确的 tenantId 设置为参数。


我在博客上写过关于使用 Spring Boot、JPA、Hibernate 和 Postgres 的多租户应用程序,即使我采用了每个租户的 DB 方法,DISCRIMINATOR(用于指定不同租户的一个或多个表列)方法你是使用最有可能需要较少的配置。

看看 CurrentTenantIdentifierResolver 实现 (TenantDvdRentalIdentifierResolverImpl.java)、DvdRentalMultiTenantInterceptor.java Spring MVC 拦截器和使用 ThreadLocal 存储/传递tenantId 的 DvdRentalTenantContext.java。

  • 看起来hibernate还没有实现基于DISCRIMINIATOR的多租户策略,这个问题(hibernate.atlassian.net/browse/HHH-6054)仍然存在。
  • 我相信Hibernate 5可以


来源:https://www.codenong.com/44135582/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_8734.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?