JPA信息库与实体责任

mst*_*rom 4 orm hibernate jpa repository-pattern

我刚进入JPA的世界,对我来说似乎有些困惑的是存储库类的职责与实体类的职责。

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

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

谢谢!

M.S*_*sti 8

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

  • An Entity是您的域对象,通常对应于表中的一行。我之所以经常说是因为an 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
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • Repository是一个对象,其上提供了基本的CRUD操作一个 Entity。这是一个例子:

    public interface UserRepository extends JpaRepository<User,Long> {
    
      @Query("select u from #{#entityName} u where u.lastname = ?1")
      List<User> findByLastname(String lastname);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • A 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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


Nik*_* S. 5

JPA 通常与三个模块一起使用:
- 实体本身
- 服务
- 存储库

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

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

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

  • 我认为您的答案混合了服务和存储库。请参阅[我的回答](/sf/answers/3760301191/),它直接从 Spring Data JPA 中提供了示例。 (2认同)