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

时间:2019-04-25 15:02:30

标签: 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>

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

2 个答案:

答案 0 :(得分:2)

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

IMO,您试图做的事适得其反。当您扩展CrudRepository时,Spring的数据存储库在运行时提供了类型安全的CRUD方法实现。这样可以使代码更简洁,并提供编译时正确性。而且,CrudRepository已经很通用了-这样更好(在接口级别上比在实现上更好)。

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

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

答案 1 :(得分:0)

这是错误的方法。 CrudRepositories不应该实现。 您只需通过扩展CrudRepository接口为所有模型创建Repository接口。 Spring在运行时提供了实现。

如果要通过单个类访问它们,则创建一个Service类,该类具有访问这些单独存储库中所需方法的方法。