java - 我可以让一个 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 存储库接口?
解决方案
根据 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();
}
推荐阅读
- linux - 如何删除或忽略已安装卷中不需要的 .snapshot?
- javascript - 管理大量记录时的 setState 长执行
- python - 如何在正则表达式中使用变量
- sql - Hive:无法使用限制执行联合查询
- .htaccess - .htaccess 带有 queryString 的 SEO 友好 URL
- swift - 准备更新 Core ML 模型
- python-3.x - 错误:解包需要 16 字节的缓冲区
- java - 对服务器的连续 UDP 请求无法按预期工作
- vb.net - 如何将注册表值读入标签或 msgbox
- javascript - 在 WKWebView 中使用 scrollIntoVIew 跳转到页面顶部