java - 是否可以创建一个通用存储库来扩展其他扩展 Spring 的 CrudRepository 的接口?
问题描述
以下是详细信息:
我的应用程序中有多个模型,每个模型都有一个扩展 Spring 的CrudRepository
.
例如:
EyeColorModel
有存储库interface EyeColorRepository extends CrudRepository<EyeColor, Long>
HairColorModel
有存储库interface HairColorRepository extends CrudRepository<HairColor, Long>
StateModel
有存储库interface StateRepository extends CrudRepository<State, Long>
等等 ...
我想创建一个MyApplicationRepository
扩展我所有个人存储库的泛型,这样我只需要创建一个实例,MyApplicationRepository
而不是创建我的个人存储库的多个实例。
我试过这个:
public interface MyApplicationRepositoryInterface extends
EyeColorRepository,
HairColorRepository,
StateRepository {
}
public class MyApplicationRepository implements MyApplicationRepositoryInterface {
}
但是,当我尝试扩展我的所有个人存储库时,MyApplicationRepositoryInterface
我收到此错误:
CrudRepository cannot be inherited with different arguments: <com.myapp.Models.EyeColor, java.lang.Long> and <com.myapp.Models.HairColor, java.lang.Long>
那么有没有办法做我想做的事,还是我坚持实例化所有模型存储库的实例?
解决方案
首先,我将尝试解释您遇到的错误:CrudRepository
是参数化接口,并且从CrudRepository
不同参数化类型的(多个)接口继承会在运行时产生冲突。
国际海事组织,你试图做的是适得其反。当您扩展CrudRepository
. 这为您提供更简洁的代码,并提供编译时正确性。而且,CrudRepository
已经很通用了——这样更好(在接口级别,而不是在实现中)。
即使您要创建这样的存储库,您也必须放弃使用CrudRepository
并创建一个包含所有模型的所有 CRUD 方法的单个类(例如 saveEyeColor、saveHairColor 等)。也许使用类似SpringTemplate
. 这不是解决 IMO 的最佳方法,因为您将混合您的域对象,并且该类将成为维护的噩梦。
要回答您的问题,是的,您必须为每个模型注入一个单独的存储库实例。
推荐阅读
- android - Android Studio 使用空文件夹恢复已删除和删除的模块
- ios - 如何使用 NSExtensionPrincipalClass 显示 Storyboard UI 以共享扩展
- javascript - 两次 Axios 调用后如何设置 SetState?
- typo3 - 在typo3中将数据写入go_maps_ext
- c# - WCF 元数据读取异常
- python - 从文本文件返回值作为布尔值
- c# - 如何使用 OpenXml 将 Excel 转换为 Html
- hadoop - AWS Athena 在分区加载后创建缩进并将值移动到错误的列中
- java - 欢迎留言 JSP JAVA
- html - 使用 mpdf 在 PDF 输出中的样式跨度标签