【问题标题】:how to save simple CRUD codes in a service, just like GenericDao/JpaRepository?如何在服务中保存简单的 CRUD 代码,就像 GenericDao/JpaRepository 一样?
【发布时间】:2011-10-05 09:01:36
【问题描述】:

我们的 web 项目使用 spring3、Jpa (hibernate)。

为了节省 CRUD 和其他常用方法,我们将 repositories 设为 spring JpaRepository 的子类。

有时我只是将存储库注入到 Controller 中,方便那些简单(或没有)业务逻辑只读数据访问。例如在视图中列出一个实体类型的所有对象...我知道所有这些都应该在具有事务范围的服务层中完成,但是确实很方便。

现在有一个规则:控制器层必须通过服务访问数据层。不允许将存储库注入控制器。

例如:

我有一个实体:Country.java

我有interface CountryRepository extends JpaRepository<Country, Long>

我还有 CountryService 和 CountryServiceImpl,它们注入了 countryRepository。然后我要创建findAll、findOne、count、findAll(withsorting)....方法,而那些实现无非就是return countryRepository.findAll() countryRepository.findOne(id) countryRepository.count()...

对于每个实体,我必须一次又一次地做同样的事情......

是否可以在服务层使用通用方式保存这些方法?

【问题讨论】:

    标签: java spring jpa repository


    【解决方案1】:

    仅公开您的应用程序真正使用的服务。我怀疑每个实体都需要findAllcount

    这些方法的实现非常简单,这是一件好事:实现和测试它们不会有任何困难。如果它们变得更复杂,并且需要多个存储库方法调用和一些业务逻辑,您会很高兴只需要修改方法,而不是更改所有设计。

    【讨论】:

    • 我不需要 findAll,但我确实需要 findOne 来处理 >90% 的情况。而对于一些领域数据,也许我们只需要两个方法(findone 和 findAll)。但是我们必须创建 1 个接口和 1 个 serviceImpl,并在其中“重复”存储库方法。保存一些代码会很好。
    • 您不一定需要为每个实体提供服务。我通常为每个用例或每个逻辑用例集提供一项服务。例如:一个客户管理服务,另一个产品管理服务等。但是在产品管理服务中,我将管理产品,类别,价格等。在客户管理中,我将管理客户,他们的地址,他们的联系人等。这节省了一些类和依赖项。服务用于实现业务逻辑,而不是与单个实体相关的东西。
    • 我同意您的服务意见。但是方便的存储库方法无论如何都会在服务中重复。
    猜你喜欢
    • 2018-01-10
    • 2022-08-19
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 2015-06-02
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多