详细信息如下:
我的应用程序中有多个模型,每个模型都有一个扩展 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/