以下是详细情况:
我的应用程序中有多个模型,每个模型都有一个扩展Spring的< code>CrudRepository的存储库。
例如:
>
EyeColorModel
具有存储库接口EyeColorRepository扩展CrudRepository
< code>HairColorModel具有存储库< code >接口HairColorModel扩展了CrudRepository
StateModel
具有存储库接口,StateRepository扩展了Crudepository
等等...
我想创建一个通用的 MyApplicationRepository
来扩展我所有的个人仓库,这样我只需要创建 MyApplicationRepository
的单个实例,而不必创建我个人仓库的多个实例。
我试过这个:
public interface MyApplicationRepositoryInterface extends
EyeColorRepository,
HairColorRepository,
StateRepository {
}
public class MyApplicationRepository implements MyApplicationRepositoryInterface {
}
然而,当我尝试在< code > MyApplicationRepositoryInterface 中扩展我的所有个人存储库时,我得到了以下错误:
CrudRepository cannot be inherited with different arguments: <com.myapp.Models.EyeColor, java.lang.Long> and <com.myapp.Models.HairColor, java.lang.Long>
那么,有没有一种方法可以完成我想做的事情,或者我只是在实例化我所有模型库的实例?
首先,我将尝试解释您得到的错误:< code>CrudRepository是一个参数化接口,从不同参数化类型的(多个)< code>CrudRepository接口继承会在运行时产生冲突。
IMO,你试图做的事情适得其反。Spring的数据存储库在运行时提供了CRUD方法的类型安全实现,当您扩展CrudRepository时
。这为您提供了更清晰的代码,并提供了编译时的正确性。而且,CrudRepository
已经非常通用 - 这种方式更好(在接口级别,而不是在实现中)。
即使您要创建这样的存储库,您也必须放弃使用CrudRepository
,并使用所有模型(例如saveEyeColor,saveHairColor等)中的所有CRUD方法创建一个类。也许使用类似SpringTemplate
的东西。这不是IMO的最佳方法,因为您将混合域对象,并且该类将成为维护的噩梦。
要回答您的问题,是的,您必须为每个模型注入一个单独的存储库实例。
这是错误的方法。CrudRepositories不应该被实现。您只需通过扩展CrudRepository接口为所有模型创建存储库接口。Spring在运行时提供了实现。
如果您想通过单个类访问这些,请创建一个Service类,其中包含访问这些单独存储库中所需方法的方法。
如果您正在寻找使用存储库结构在spring boot中运行自定义SQL查询。请看一看。
https://stackoverflow.com/a/71501509/4735043