【问题标题】:Spring Data:: Making Repository Methods Available in Service InterfacesSpring Data:: 使存储库方法在服务接口中可用
【发布时间】:2019-07-05 09:34:39
【问题描述】:

我正在为我的存储库使用 spring Data 和 JPA/Hibernate。当我扩展 JpaRepository 时,我会像往常一样获得许多方法,因为它实现了 PagingAndSortingRepository 和 CrudRepository。

我正在使用我的服务类中的存储库。我现在的问题是,有没有一种方法可以在我的服务接口中获取存储库中的所有方法,以便服务实现类可以使用与存储库相同的方法名称将调用委托给存储库。

我想使用与存储库方法相同的方法名称,也不想直接从控制器调用我的存储库。

我是否必须将 JpaRepository、PagingAndSortingRepository 和 CrudRepository 中的所有方法签名复制到我的服务接口中?

【问题讨论】:

    标签: java spring hibernate spring-data-jpa spring-data


    【解决方案1】:

    您不需要将Repository 的方法复制到任何服务。 Spring Data JPA 提供了许多强大的功能来编写自定义查询。

    假设您有一个名为User 的域的UserRepository,并希望通过他/她的电子邮件地址查找用户。不要在扩展 UserRepository 的单独服务中创建 findByEmail 方法,只需在 UserRepository 接口中声明它即可:

    User findByEmail(String email);
    

    Spring Data JPA 将为您完成所有繁琐的工作。您可以通过在Controller(或其他类)中注入UserRepository 来调用此方法。

    以上只是一个简单的例子。您甚至可以声明具有多个条件的查询:

    User findByEmailOrUsername(String email, String username);
    
    User findByEmailAndActiveTrue(String email);
    
    List<User> findTop10ByEmail();
    

    我建议您探索 Spring Data JPA 的 official documentation。只需编写几行代码,您就可以做很多事情。

    【讨论】:

      【解决方案2】:

      我认为您误解了 Service 的真正含义。
      Service 是处理业务逻辑的地方。它的方法应该代表业务操作,而不仅仅是数据检索/持久化。

      简单地拥有所有JpaRepository 方法并委托给Repository 会导致大量代码重复,您应该避免这种情况。

      根据您的业务需求构建您的 Service
      如果您觉得不需要 Service 中间件,可能是因为您只获取/设置数据,只需 Autowire Repository 在您的 Controller 中。

      Controller 中使用Repository 并不总是正确的。视情况而定。

      【讨论】:

        【解决方案3】:

        如果我正确理解了这个问题。首先将存储库创建为扩展 JpaRepository 或其他接口的接口,不要忘记使用 @Repository 注释您的接口。然后创建您的服务并将您的存储库注入它,这样您就可以在服务中创建自己的方法(可以使用任何名称)。然后你可以将服务注入你的控制器。这种技术最常用。

        【讨论】:

        • 为什么不在存储库接口中声明自己的方法呢?这就是 Spring Data JPA 的建议。这将节省大量时间。
        • 我知道我们可以将自己的方法放在存储库中,我只是给出了 spring data 的最简单用法
        猜你喜欢
        • 1970-01-01
        • 2015-02-13
        • 2017-08-01
        • 1970-01-01
        • 2017-08-20
        • 2012-11-25
        • 2015-05-10
        • 2021-08-25
        • 2021-11-11
        相关资源
        最近更新 更多