2011-10-05 33 views
2

我们的web项目使用spring3,Jpa(休眠)。如何像GenericDao/JpaRepository一样在服务中保存简单的CRUD代码?

为了保存CRUD和其他常用的方法,我们创建了Spring JpaRepository的存储库子类。

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

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

例如:

我有一个实体:Country.java

而且我有interface CountryRepository extends JpaRepository<Country, Long>

我也有CountryService和CountryServiceImpl,其中有countryRepository注入。然后,我必须创建findAll,findOne,count,findAll(有排序)....方法,那些实现无非是return countryRepository.findAll() countryRepository.findOne(id) countryRepository.count()...

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

服务层可能使用通用方式保存这些方法吗?

回答

1

只显示您的应用程序真正使用的服务。我怀疑你对每个实体都需要findAllcount

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

+0

我不需要findAll,但是我确实需要findOne> 90%的情况。对于某些域数据,也许我们只需要两种方法(findone和findAll)。但是我们必须创建1个接口和1个serviceImpl,然后“重复”其中的存储库方法。会很好的保存一些代码。 – Kent

+0

您不一定需要为每个实体提供服务。我通常每个用例都有一个服务,或者每个逻辑用例都有一个服务。例如:客户管理服务,产品管理服务等。但在产品管理服务中,我将管理产品,类别,价格等。在客户管理中,我将管理客户,他们的地址,他们的联系人等。这节省了一些类和依赖关系。服务在那里实现业务逻辑,而不是单个实体相关的东西。 –

+0

我同意你的服务意见。但无论如何,方便的存储库方法在服务中重复使用。 – Kent

相关问题