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

Apr*_*ril 10 java service data-access-layer repository

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

Man*_*ani 12

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

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

让我们举一个例子.您必须保存实体(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);
}
Run Code Online (Sandbox Code Playgroud)

在您的存储库层中,只关注数据库操作.

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


Mar*_*tin 6

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

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

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


小智 6

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

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

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


Jas*_*zak 2

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

服务层是数据的 API。您通常会听到一些逻辑级别,或者在服务和存储库之间的另一个抽象层中。

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