使用 Spring Data JPA 的服务层中的 Crud 方法

Posted

技术标签:

【中文标题】使用 Spring Data JPA 的服务层中的 Crud 方法【英文标题】:Crud methods in service layer using Spring Data JPA 【发布时间】:2014-09-11 11:32:03 【问题描述】:

我正在使用 Spring 和 Spring Data JPA 构建一个小型应用程序,我需要在服务层使用 CrudRepository 方法,所以我创建了 2 个类:GenericService 和 GenericServiceImpl。但我不知道这是否是正确的,甚至是最好的方法。

这是一个例子:

POJO:

@Entity
public class User 

  @Id
  private Long id;

  private String username;

道:

public interface UserDAO extends CrudRepository<User, Long> 
  User findOneByUsername(String username);

通用服务

public interface GenericService<T, ID extends Serializable> 
  <S extends T> S save(S entity);

服务

public interface UserService extends GenericService<User, Long>  
  User findOneByUsername(String username);

通用服务实现

public class GenericServiceImpl<T, ID extends Serializable> implements GenericService<T, ID> 

    @Autowired
    private CrudRepository<T, ID> repository;

    @Override
    public <S extends T> S save(S entity) 
        return repository.save(entity);
    

服务实现

@Service
@Transactional
public class UserServiceImpl extends GenericServiceImpl<User, Long> implements UserService 

  @Autowired
  private UserDAO userDAO;

  @Override
  public User findOneByUsername(String username) 
    userDAO.findOneByUsername(username);
  

【问题讨论】:

你为什么要做所有的手动委托而不是直接使用存储库接口? “直接使用存储库接口”是什么意思?我试图做这样的事情Spring and Autowiring of Generic Types 从控制器访问UserDAO可以吗?我真的不需要我刚刚这样做的服务层,因为我认为这将是最佳实践。 是的,如果您的服务层没有添加更多逻辑。当服务层不仅仅做数据访问时,您将需要对较大的项目进行分离。 这真的有效吗?正在尝试但在我的应用程序启动期间总是出现异常:没有找到类型 [org.springframework.data.jpa.repository.JpaRepository] ​​的合格 bean 依赖(使用 JpaRepository 而不是 CrudRepository) 【参考方案1】:

是的,您提供了自己的 impl,它可以做自定义的事情,同时仍然重用来自 Spring JPA 的 CrudRepository 的派生查询。我见过很多。 :) 如果我们想在调用派生方法之前进行自己的计算,我们需要这样做。毕竟,该计算很可能是存储库的一部分,因此将该逻辑放入服务中是没有意义的。但是在您的场景中,如果没有此类自定义计算,则不需要此间接。正如评论者所说,您应该直接使用 UserDao 接口。 :)

【讨论】:

以上是关于使用 Spring Data JPA 的服务层中的 Crud 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Data JPA 中获取 countQuery 返回的计数?

Spring Data JPA 中的动态查询

微服务 第六章 springboot 通过Spring-data-jpa 配置Oracle数据源(Spring-data-jpa详细介绍)

使用Spring-Data-JPA进行Spring启动:每次请求时都会填充ArrayList / JSON对象

spring data jpa中的page对象带到jsp页面遍历问题

构建RESTful服务(使用Spring Data JPA)