繁体   English   中英

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

[英]Is it possible to create a generic repository that extends other interfaces that extend Spring's CrudRepository?

详细信息如下:

我的应用程序中有多个模型,每个模型都有一个扩展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是一个参数化接口,并且从(多个)不同参数化类型的CrudRepository接口继承会在运行时产生冲突。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM