首页 > 解决方案 > 是否可以创建一个通用存储库来扩展其他扩展 Spring 的 CrudRepository 的接口?

问题描述

以下是详细信息:

我的应用程序中有多个模型,每个模型都有一个扩展 Spring 的CrudRepository.

例如:

我想创建一个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>

那么有没有办法做我想做的事,还是我坚持实例化所有模型存储库的实例?

标签: javaspringspring-repositories

解决方案


首先,我将尝试解释您遇到的错误:CrudRepository是参数化接口,并且从CrudRepository不同参数化类型的(多个)接口继承会在运行时产生冲突。

国际海事组织,你试图做的是适得其反。当您扩展CrudRepository. 这为您提供更简洁的代码,并提供编译时正确性。而且,CrudRepository已经很通用了——这样更好(在接口级别,而不是在实现中)。

即使您要创建这样的存储库,您也必须放弃使用CrudRepository并创建一个包含所有模型的所有 CRUD 方法的单个类(例如 saveEyeColor、saveHairColor 等)。也许使用类似SpringTemplate. 这不是解决 IMO 的最佳方法,因为您将混合您的域对象,并且该类将成为维护的噩梦。

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


推荐阅读