首页 > 解决方案 > 我可以让一个 JPA 存储库接口使用 Spring Data JPA 处理多个实体类吗?

问题描述

我不太喜欢Spring Data JPA ,并且在处理Spring Boot项目时遇到以下问题。

我对如何正确处理这种情况有以下架构疑问:

我有一个由这样的接口实现的存储库,我在其中定义了我的“查询方法”:

public interface ExcelRepository extends CrudRepository<Country, Integer> {

    public List<Country> findAllByOrderByCountryNameAsc();

    public List<BlockAttackDetail> findAllByOrderByAttackTypeAcronymAsc();
}

如您所见,我正在扩展CrudRepository接口,并指定了一个名为 **Country* 的模型类,映射我数据库上的特定表。

我添加了第二种方法,该方法适用于映射不同数据库表的另一个实体类 ( BlockAttackDetail )。

因此,启动我的应用程序时,我会收到此错误,因为此存储库仅适用于Country实体类映射的数据库表:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property attackTypeAcronym found for type Country!

我的问题是:我是否要创建多个 JPA 存储库接口(每个实体一个)或是否存在让单个 JPA 存储库接口在多个实体类上工作的方法?

在我的特定情况下,我将很少有方法与特定数据库表(与实体)交互,并且我不希望有一个存储库接口来处理多个实体类(以避免混淆)。

我能以某种方式做到吗?如果我能做到,从架构的角度来看是否有意义,或者最好为每个实体类提供一个特定的 JPA 存储库接口?

标签: javaspringspring-bootjpaspring-data-jpa

解决方案


根据 Spring Data 文档,您应该为每个实体拥有一个存储库

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.definition

在您的情况下,完成工作的唯一方法是使用 Spring Data JPA:

public interface CountryRepository extends CrudRepository<Country, Integer> {

   public List<Country> findAllByOrderByCountryNameAsc();
}

public interface BlockAttackDetailRepository extends CrudRepository<BlockAttackDetail, Integer> {

   public List<BlockAttackDetail> findAllByOrderByAttackTypeAcronymAsc();
}

推荐阅读