Spring Boot:如何使用 Repository 单独持久化一对多关系

Mar*_*man 1 spring hibernate spring-data-jpa spring-boot

我有两个班级,部门员工。它们是一对多的关系,即一个部门可以有很多员工。

没有部门,员工就不能存在。
部门可以有 0 到 n 个员工。

我得到了这两个项目的列表...这些列表可以包含新条目和更新的条目。

我的问题是,我该怎么做?

  1. 独立保存/合并部门
  2. 步骤 1. 独立保存/合并员工(确保部门 ID 员工拥有,存在于部门表中)

或者

  1. 保存/合并部门与Set<>员工?

或者

有没有另一种方法可以做到这一点,我还没有想过?

Max*_*kov 5

有两种模式称为“Repository”和“Aggregate”,它们来自 Eric Evans Domain Driven Design一书,使用其中一种是最佳实践。

存储库模式

  • 两个独立的实体(部门和员工)
  • @OneToMany实体之间没有 JPA 关系 ( )
  • employee只包含它的departmentId字段
  • 两个存储库 ( departmentRepo, employeeRepo)

如果你必须得到员工的部门,它应该是这样的:

department = departmentRepo.findById(employee.departmentId)
Run Code Online (Sandbox Code Playgroud)

保存实体也独立使用它们的存储库完成:

newDepartment = departmentRepo.save(new Department())
newEmployee = employeeRepo.save(new Employee(newDepartment.id))
Run Code Online (Sandbox Code Playgroud)

聚合模式

与两个存储库不同,实体之间没有连接,聚合模式使用:

  • 一个存储库(departmentRepo在这种情况下)
  • department实体@OneToManyemployees(部门包含员工)有联系。

在这种情况下,要获取员工,您必须使用部门存储库:

employees = departmentRepo.findById(departmentId).employees
Run Code Online (Sandbox Code Playgroud)

保存同样的事情:您应该保存部门以保存员工的更改。

回顾

这些模式的任何混合(最常见:实体之间的两个 repos 和 JPA 关系)都会导致未来真正难以维护的问题。

在大多数情况下,我更喜欢 Repository 模式:每个实体的存储库,并且实体之间没有关系。

在您的情况下,我会选择存储库模式。