存储库和服务层之间的区别

时间:2014-04-09 12:59:51

标签: java service repository data-access-layer

我查看了一些相关问题,但我仍未发现存储库和服务层之间存在很大差异。所以考虑到这个例子,我想它应该是这样的,如果不是,请告诉我为什么?

public interface ProductRepository extends CrudRepository<Product, Long>{

    public List<Product> findByName(String name);
    public List<Product> findByPrice(Double price);
}

public interface ProductService {

    public List<Product> findAll();
    public Product findById(Long id);
    public Product save(Product product);
    public void delete(Product product);
    public List<Product> findByName(String name);
    public List<Product> findByPrice(Double price);
}

并且ProductService的实现将使用ProductRepository来实现这些方法。据我所知http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html,存储库中方法的查询是自动生成的。在我的示例中,方法在存储库和服务中重复,因此请解释什么/为什么需要更改?

5 个答案:

答案 0 :(得分:8)

您的所有业务逻辑都应位于服务层中。

对数据库(任何存储)的任何访问都应该进入存储库层。

让我们举一个例子。您必须保存实体(Person)。但在保存Person之前,您需要确保Person的FirstName不存在。

因此验证部分应该转到业务层。

在服务层

PersonRepository repository; 
public Person save(Person p){
   Person p = findByName(p.getName();
   if (p != null){
          return some customException();
   }
   return repository.save(p); 
}

public Person findByName(String name){
     return repository.findByName(name);
}

在您的Repository Layer中,只关注数据库操作。

您可以在Repository Layer中完成此操作。假设您已在存储库中实现了此功能,那么保存方法始终在保存之前进行检查(有时您可能不需要这样做)。

答案 1 :(得分:5)

Repository Layer为您提供了更多的数据访问抽象级别。存储库层公开了基本的CRUD操作。

服务层公开使用存储库的业务逻辑。

  

您可以在此处阅读更详细的答案:   https://stackoverflow.com/a/5049454/1446006

答案 2 :(得分:3)

存储库是一种数据访问模式,其中数据传输对象被传递到管理CRUD操作的存储库对象中。这种模式在数据访问机制可能发生重大变化的情况下非常有用 - 例如您希望在一个实现中使用不同的数据存储,例如Oracle,在SQL Server中使用HADOOP,或者在另一个实现中使用HADOOP。

服务层是SaaS体系结构中常用的业务逻辑模式。使用服务层允许一个或多个表示实现通过公共接口访问您的业务逻辑。例如,如果您希望您的网站拥有API,您可以使用服务层来实现网站和API将使用的常见后端功能。

前者应主要关注数据访问,后者应关注业务逻辑。既不是强制性的,也不一定要伴随另一个。在简单的应用程序中,两个模式可以由同一个类实现。

答案 3 :(得分:1)

据我所知,Repository用于直接访问数据库。这是直接调用存储过程或任何数据存储机制的地方。

服务层是数据的API。通常会有一些逻辑层次,或者在服务和存储库之间的另一层抽象中。

例如,网站会在您的服务中调用方法。您的服务会调用您的存储库来获取该数据,然后您的服务会以某种方式对其进行转换(构建对象,根据业务规则生成动态信息等),然后将其传递回网站。

答案 4 :(得分:0)

在这种情况下,您似乎正在使用 Spring Data,其中存储库充当 DAO(它们定义可用的数据库操作,并且这些方法的实现由框架生成)。服务层应该位于存储库之上,即它通过存储库访问数据。

其他答案没有指出您可能不需要服务层:如果您的实现看起来很简单(仅将实体传递给控制器​​而不进行任何处理),那么服务层可能是不必要的抽象级别你的申请。您应该只在有某种用途时才创建服务层。

相关问题