java - 是否可以创建一个通用存储库来扩展其他扩展 Spring 的 CrudRepository 的接口(interface)?

标签 java spring spring-repositories

详细信息如下:

我的应用程序中有多个模型,每个模型都有一个扩展 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 是一个参数化接口(interface),继承自(多个)不同参数化类型的 CrudRepository 接口(interface)在运行时产生冲突。

IMO,你想做的事情会适得其反。当您扩展 CrudRepository 时,Spring 的数据存储库在运行时提供 CRUD 方法的类型安全实现。这为您提供了更清晰的代码,并提供了编译时的正确性。而且,CrudRepository 已经相当通用了 - 这样更好(在接口(interface)级别,而不是在实现级别)。

即使您要创建这样的存储库,您也必须放弃使用 CrudRepository 并创建一个类,其中包含所有模型中的所有 CRUD 方法(例如 saveEyeColor、saveHairColor , ETC)。也许使用诸如 SpringTemplate 之类的东西。在我看来,这不是最好的方法,因为您将混合域对象,并且该类将成为维护的噩梦。

要回答您的问题,是的,您必须为每个模型注入(inject)一个单独的存储库实例。

关于java - 是否可以创建一个通用存储库来扩展其他扩展 Spring 的 CrudRepository 的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55852352/

相关文章:

java - 在 WHERE 子句中使用 CASE WHEN 的 JPA 查询。怎么做?

spring - 如何自定义@FeignClient Expander 来转换参数?

java - spring boot 按字段搜索规范查找

java - MongoDB 和 Spring Boot - 更新文档的最佳方式?

java - IO 与数据库 : Which is faster?

java - 正则表达式与前面的精确文本匹配或不匹配

java - 使用 restAssured 测试 Spring Boot Rest 应用程序

java - 为什么 loadUserByUserName 没有被调用?

java - 如何在 spring 存储库中获取具有某些状态和最新 id 的行?