JPA存储库与实体职责

时间:2014-08-08 12:29:44

标签: hibernate jpa orm repository-pattern

我刚刚进入JPA世界,有一件事似乎让我感到困惑的是Repository类的责任与实体类的责任。

例如,如果我在两个实体之间定义了关联,那么子对象的添加/删除是否应该发生在父存储库或实体类中?

此外,应该通过Service中的entityManager.persist方法调用来保存,还是应该在存储库类中有自定义保存方法?

谢谢!

2 个答案:

答案 0 :(得分:5)

注意:以下示例摘自Spring Data JPA documentation

  • Entity是您的域对象,经常对应于表中的一行。我之所以经常说是因为Entity可以是一行的一部分,也可以是多个表中的行连接在一起的一部分。在关系数据库的上下文中,Entity对应于关系。这是一个示例:

    @Entity
    public class User {
    
      @Id
      @GeneratedValue
      Long id;
    
      String lastname;
    
      ... // Other fields, such as the user role, as well as getters and setters
    }
    
  • Repository是一个对象,它提供对一个 Entity的基本CRUD操作。这是一个示例:

    public interface UserRepository extends JpaRepository<User,Long> {
    
      @Query("select u from #{#entityName} u where u.lastname = ?1")
      List<User> findByLastname(String lastname);
    }
    
  • Service是一个对象,它对一个或多个Repository对象进行操作,提供特定于应用程序的逻辑,并解决诸如事务管理之类的跨领域问题。这是一个示例:

    @Service
    class UserManagementImpl implements UserManagement {
    
      private final UserRepository userRepository;
      private final RoleRepository roleRepository;
    
      @Autowired
      public UserManagementImpl(UserRepository userRepository,
        RoleRepository roleRepository) {
        this.userRepository = userRepository;
        this.roleRepository = roleRepository;
      }
    
      @Transactional
      public void addRoleToAllUsers(String roleName) {
    
        Role role = roleRepository.findByName(roleName);
    
        for (User user : userRepository.findAll()) {
          user.addRole(role);
          userRepository.save(user);
        }
    }
    

答案 1 :(得分:4)

JPA经常使用三个模块:
- 实体本身
- 服务
- 存储库

实体基本上没有任何责任,它只是一个带有字段和getter以及setter的POJO(Plain Old Java Object)。

服务负责执行CRUD(创建读取更新删除)操作,因此它访问EntityManager或在Hibernate中访问SessionFactory并执行插入和填充。

存储库通常只提供与服务相同的方法并委托给服务。但是,如果您需要在使用它们之前或在编写它们之前使用数据库中的对象完成某些操作,则可以在存储库中完成。你也可以在那里实现缓存。