以下是详细信息:
我的应用程序中有多个模型,每个模型都有一个扩展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>
那么有什么办法可以做我想做的事,还是我坚持实例化所有模型存储库的实例?
答案 0 :(得分:2)
首先,我将尝试解释您遇到的错误:CrudRepository
是一个参数化接口,并且从(多个)不同参数化类型的CrudRepository
接口继承会在运行时产生冲突
IMO,您试图做的事适得其反。当您扩展CrudRepository
时,Spring的数据存储库在运行时提供了类型安全的CRUD方法实现。这样可以使代码更简洁,并提供编译时正确性。而且,CrudRepository
已经很通用了-这样更好(在接口级别上比在实现上更好)。
即使您要创建这样的存储库,也必须放弃使用CrudRepository
并使用所有模型中的所有CRUD方法(例如saveEyeColor,saveHairColor等)创建单个类。 。也许使用类似SpringTemplate
之类的东西。这不是实现IMO的最佳方法,因为您将混合域对象,而该类将成为维护的噩梦。
要回答您的问题,是的,您必须为每个模型注入一个单独的存储库实例。
答案 1 :(得分:0)
这是错误的方法。 CrudRepositories不应该实现。 您只需通过扩展CrudRepository接口为所有模型创建Repository接口。 Spring在运行时提供了实现。
如果要通过单个类访问它们,则创建一个Service类,该类具有访问这些单独存储库中所需方法的方法。