spring - Spring Boot:如何使用 Repository 分别保持一对多关系
问题描述
我有两个班级,部门和员工。他们是一对多的关系,即一个部门可以有很多员工。
没有部门,员工就无法存在。
部门可以有 0 到 n 名员工。
我得到了这两个项目的列表......这些列表可以包含新条目和更新的条目。
我的问题是,我该怎么做?
- 独立保存/合并部门
- 在步骤 1 之后独立保存/合并员工(确保员工拥有的部门 ID 存在于部门表中)
或者
- 保存/合并部门与
Set<>
员工?
或者
还有另一种我还没有想到的方法吗?
解决方案
有两种模式称为“存储库”和“聚合”,它们来自 Eric Evans领域驱动设计一书,使用其中一种是最佳实践。
存储库模式
- 两个独立的实体(部门和员工)
@OneToMany
实体之间没有 JPA 关系 ( )employee
只包含它的departmentId
字段- 两个存储库 (
departmentRepo
,employeeRepo
)
如果你必须得到员工的部门,它应该是这样的:
department = departmentRepo.findById(employee.departmentId)
保存实体也独立使用其存储库完成:
newDepartment = departmentRepo.save(new Department())
newEmployee = employeeRepo.save(new Employee(newDepartment.id))
聚合模式
不像两个存储库和实体之间没有连接聚合模式使用:
- 一个存储库(
departmentRepo
在这种情况下) department
实体@OneToMany
与employees
(部门包含员工)有联系。
在这种情况下,要获取员工,您必须使用部门存储库:
employees = departmentRepo.findById(departmentId).employees
保存同样的事情:您应该保存部门以保存员工的更改。
回顾
这些模式的任何混合(最常见:实体之间的两个 repos 和 JPA 关系)都会在未来导致非常难以维护的问题。
在大多数情况下,我更喜欢存储库模式:每个实体都有存储库,并且实体之间没有关系。
在您的情况下,我会选择存储库模式。
推荐阅读
- sql - SQL 连接表和 CASE 与 CONCAT
- php - 如何在 woocommerce 产品中隐藏引荐来源链接
- python - 函数问题:SyntaxError:解析时出现意外 EOF
- python - Python / Pandas - 当Dataframe是多索引DataFrame时如何定义列的dtype?
- java - java中地图的时间复杂度
- javascript - 来自js静态文件的事件侦听器指向Django中的错误路径
- c# - 添加 .runsettings 文件时 TFS 构建失败
- c++ - 速度:C++ 中的 typedef 与 #define
- passenger - EasyApache 4/CentOS/cPanel 上的乘客不会启动 Rails 应用程序
- php - 如何在php中查找带有条件的xpath表达式的计数?