当前位置: 首页 > 知识库问答 >
问题:

适用于多个实体的通用 JPA 存储库

阳长恨
2023-03-14

我有几个实体,并使用Spring Data JPA存储库与规范查询我的数据库。因此,我创建了一个泛型类< code>SpecBuilder来基于查询描述(< code>MyQueryDescriptor)构建我的查询。

public class Specs {
  public static <T extends MyEntityIFace> Specification<T> myfind(final MyQueryDescriptor qDesc) {
    return new Specification<T>() {
      @Override
      public Predicate toPredicate(Root<T> root, 
               CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
        try {
          return SpecBuilder.mySpec(root, criteriaQuery, criteriaBuilder, qDesc);
        } catch (Exception e) {
          ...handle error...
        }
      }
    };
  }
}

我的存储库:

public interface Entity1DAO extends Repository<Entity1,Long>, 
                                    JpaSpecificationExecutor {
}

public interface Entity2DAO extends Repository<Entity2,Long>, 
                                    JpaSpecificationExecutor {
}

现在有三件事我不太确定:< br> 1)
使用泛型SpecBuilder是一个干净的设计吗?

2)
有没有办法避免为每个实体编写这些存储库接口?假设一个通用存储库?

3)< br > < code > MyQueryDescriptor 类有一个返回实体实例的方法,该实例将被查询。< br >基于实体类获得相应的存储库,避免切换的干净方法是什么?我本来想给每个实体添加一个带有特定存储库类的注释,但是感觉有点难闻。< br >我是否应该创建一个工厂并注入一个类似

Entity1.class => Entity1DAO
Entity2.class => Entity2DAO

?

共有2个答案

薄龙光
2023-03-14
    < li>

这种使用通用ScBuilder的设计是干净的吗?

取决于你对干净设计的标准。同一个< code>MyQueryDescriptor是否适用于不同的实体?当然,它们具有不同的属性,所以您需要问问自己,给定的< code>MyQueryDescriptor是否会被错误地用于不兼容的实体,以及如何防止它。我们无法对此进行评论,因为我们不知道您的< code>SpecBuilder如何工作。

有没有办法避免为每个实体编写那些存储库接口?假设一个

没有。不过,这也不是什么样板文件。

我想您可以在运行时使用< code>getBeanProvider,在这里您可以将< code>resolvableType定义为< code>CrudRepository

然而,如果我是你,我会考虑改用JPA标准API,而不使用上面的<code>JpaSpecificationExecutor</code>抽象。这可能会更自然。Spring存储库的设计以存储库围绕给定特定实体组织查询的思想为中心,而您的用例似乎正好相反——动态选择一个实体,然后找到一个适合的存储库,以满足Spring的限制。在这方面,你似乎在反对这个框架。

郑博
2023-03-14

您可以使用实体继承并使用SpringExpressionLanguage(SpEL)对正确的实体发出存储库问题调用。就像我上次更新的一样

 类似资料:
  • 我的应用程序有250多个表,每个表都有ID和name列。我正在尝试用Hibernate5+将我们的应用程序从Hibernate3迁移到Spring-JPA4.3。 在当前的hibernate层中,我有(选项1): 因此,如何在一个JPA存储库中执行以下操作:

  • 我有一个通用实体,我想使用JPA持久化,以便它的通用值存储在单个列中。简化的实体类如下所示: 类型唯一标识泛型值的类,并且允许具有相同类的多个类型: 我没有找到如何使用Hibernate保持这种泛型类的方法。我找到了替代方法和变通方法,但它们在我看来并不理想。我考虑了以下选项: > 将值的类型设置为JsonNode,并将其类型类标记为com。弗拉德米尔恰。冬眠类型json。JsonBinaryTy

  • 我开始使用SpringDataJPA存储库。我们已经有一个应用程序使用了Spring MVC(无Spring Boot或Spring数据JPA),在那里我们编写了一个Generic DAO类,该类处理我们拥有的几乎所有实体的基本CRUD操作。任何其他特殊操作都可以通过编写自定义DAO来处理。 现在,Spring data JPA让事情变得非常简单,只需要我们编写一个接口,剩下的就交给我们了。 这很

  • 我用Spring和Hibernate开发了我的Java应用程序,我有两个实体。 我创建我的服务类别,以获得Hibernate的结果 当我调试时,我在这一行中得到这个错误: 104165[http-bio-8080-exec-3]警告组织。冬眠util。JDBCExceptionReporter-SQL错误:904,SQLState:42000 104166[http-bio-8080-exec-3

  • 在我的场景中,我在运行时在“com.mrg.domain”包下生成hibernate实体类。在我的通用restcontroller中,我可以根据@PathVariable创建这些实体的实例。以下代码适用于此。。 现在,我试图实现的下一步是一个通用的jpa存储库(如下所示),这样我就可以持久化运行时生成的模型,而无需为每个实体实现存储库。但是还没有找到解决方案。 下面的主题和许多其他主题实现了通用存

  • 我有两个bean配置。每个数据库都指向具有不同模式的单独数据库(一个是Oracle,另一个是内存中的H2) 我可以做什么来解决每个存储库应该使用什么Entitymanager的模糊性?现在我得到了这个错误: 我想我可以提供一个快速的解决方法,只需使用类似 我给你一个当前场景的想法: spring-config:有两个EM 从这里开始的所有内容都在“package com.foo.repos.ora