提问者:小点点

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


以下是详细情况:

我的应用程序中有多个模型,每个模型都有一个扩展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>
    

    那么,有没有一种方法可以完成我想做的事情,或者我只是在实例化我所有模型库的实例?


  • 共3个答案

    匿名用户

    首先,我将尝试解释您得到的错误:< 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