继承所有存储库方法的 Spring Data JPA 全局过滤器子句

Posted

技术标签:

【中文标题】继承所有存储库方法的 Spring Data JPA 全局过滤器子句【英文标题】:Spring Data JPA global filter clause which inherits for all repository methods 【发布时间】:2017-09-01 22:07:07 【问题描述】:

我们正在使用 Spring boot + Spring data JPA 和 hibernate 开发一个多租户 Web 应用程序。

多租户是通过组织表实现的,该表作为外键连接到几乎每个表。这意味着每个数据库调用(Spring 数据存储库查询方法)都必须使用组织 ID 检查。

我需要一种方法,即“where organization_id =?”检查是否为每个查询方法自动注入。这样开发人员就不必专门为组织 ID 检查而烦恼。

这可以通过 Spring Data JPA 框架实现吗?这种方法的优缺点是什么?

感谢您的宝贵时间。

【问题讨论】:

Reading from multiple Db's with same Persistence Unit?的可能重复 我不认为它是重复的。我也想知道一种方法来做这样的事情,但没有成熟的多韧度。 同意罗伯特。这不是多个数据库。它是具有相同持久性单元的相同 Db。有什么建议可以实现这一目标? 【参考方案1】:

如果你有一个基类,比如 BaseEntity,你可以使用@org.hibernate.annotations.Filter:

    在 BaseEntity 中:

    @FilterDef(name = "organizationFilter", parameters = @ParamDef( name="orgId", type="long" )) @Filter(name = "organizationFilter", condition = "lang_id=:orgId")

    在会话初始化时(覆盖 JpaTransactionManager.createEntityManagerForTransaction()?):

    session.enableFilter("organizationFilter").setParameter("orgId", organization.getId());

【讨论】:

以上是关于继承所有存储库方法的 Spring Data JPA 全局过滤器子句的主要内容,如果未能解决你的问题,请参考以下文章

如何记录 Spring Data JPA 存储库方法执行时间?

Spring Data REST:覆盖控制器上的存储库方法

使用 Spring Data 创建只读存储库

将 @PostFilter 注释应用于通用 Spring Data Jpa 存储库方法

使用spring data jpa删除数据库记录时出错

我可以在 Spring Data JPA 存储库方法中将 @Query 定义与规范结合起来吗?