有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

存储库和服务层之间的java差异

我浏览了一些相关的问题,但仍然没有看到存储库和服务层之间有什么区别。所以举个例子,我想应该是这样的,如果不是,请告诉我为什么

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中了解到的,对存储库中方法的查询是自动生成的。在我的示例中,这些方法在存储库和服务中重复,因此请解释需要更改的内容/原因


共 (2) 个答案

  1. # 1 楼答案

    所有业务逻辑都应该在服务层

    对数据库(任何存储)的任何访问都应该转到存储库层

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

    所以验证部分应该转到业务层

    在服务层

    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);
    }
    

    在存储库层,只需关注数据库操作

    您可以在存储库层自己完成这项工作。假设您已经在存储库中实现了这一点,那么您的保存方法在保存之前总是进行检查(有时您可能不需要这样做)

  2. # 2 楼答案

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

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