【问题标题】:Additional filter of entity in Spring data based on profile基于配置文件的Spring数据中实体的附加过滤器
【发布时间】:2020-05-14 19:25:47
【问题描述】:

我有一个数据库表,我们称它为 USERS。在此表中,我有标准字段,例如 namesurnameage 等。 此表映射到 JPA 实体类:

@Entity
@Table(name = "users")
public class User {
    @Id
    @Column(name = "login")
    private String id;

    @Column(name = "name")
    private String name;
    //etc...
}

现在我需要有可能根据环境过滤一些用户。可以基于 Spring 活动配置文件定义环境。 我的假设是添加新的 DB 列,比如说boolean filter,并根据 Spring 配置文件过滤或不过滤用户。

问题是关于实现此功能的最佳方式,以便它干净且可维护。 一种方法是拥有两个不同的@Repository,并根据配置文件初始化正确的一个。一个存储库将返回所有用户,而另一个存储库将仅返回具有filter=false 的用户。

我不喜欢这个实现的地方是会有很多代码重复。对于每个存储库方法,我必须在第二个存储库中使用相同的方法,但基于一列进行过滤。有没有办法为给定数据库实体上的每个读取查询自动定义某种“拦截器”?

【问题讨论】:

  • 可能被误解了,但我不相信额外的列会是一个好的解决方案。它只会从您的数据库中占用更多内存,并使您的数据与服务环境紧密耦合。
  • @Nobody 我很乐意考虑任何其他解决方案。我不认为我的解决方案是最好的,因此我将不胜感激可以提供的任何其他解决方案

标签: java spring hibernate spring-boot spring-data-jpa


【解决方案1】:

不是拦截器,但可以使用 jpa 标准来做到这一点:docs

这样你就可以动态配置你想要的。 Afaik,在运行时它会比普通的旧解决方案慢一点,几个@Repository 标记有@ConditionalOnProperty,或者您选择的其他配置,但是,它满足您改变行为的要求,而无需引入多个存储库。您想要做的是声明 Specification /default 并传递它。这样您以后也可以在运行时配置您的搜索。

【讨论】:

  • 感谢您的回答。我不喜欢这种方法的是,在这种情况下,存储库将了解 spring 配置文件及其运行的环境。我不会在存储库中有这种依赖关系。
  • 按照规范,您的存储库将不知道配置文件。然而,对于不同的问题/环境有不同的解决方案真的有那么糟糕吗?
  • 规范看起来很有趣。我绝对应该调查一下。有一个单独的解决方案也不错。我想要实现的主要目标是从应用程序外部注入必须使用什么解决方案的可能性。这就是为什么我认为 Spring 配置文件与之匹配的原因。但是我不想通过我的应用程序公开它,因为这只是配置而不是业务逻辑
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多