spring - 有没有办法在 Spring JPA 中的 @ManyToOne 关系上自动将父 ID 持久保存到子实体?
问题描述
假设我的应用程序中有一个部门和员工实体,我希望能够保存一个部门,但在保存操作中还保存可能提供的任何员工。
我正在使用 Cascade.PERSIST,部门和员工实体已保存,但问题是部门 ID(外键)不会自动保存在员工实体中。
我知道我可以将每个员工的部门设置为服务层,但我想知道是否有任何其他方式(可能是一些注释或属性)以便自动保存部门 ID。
示例代码:
@Entity
@Table(name = "DEPARTMENTS")
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String deptName;
@OneToMany(mappedBy = "department", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
private Set<Employee> employees;
// getters and setters
}
@Entity
@Table(name = "EMPLOYEES")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String fullName;
private Double salary;
@ManyToOne
@JoinColumn
private Department department;
// getters and setters
}
@PostMapping("/")
public void save(@RequestBody Department department) {
//can the next line be avoided:
//department.getEmployees().stream().forEach(e -> e.setDepartment(department));
departmentRepository.save(department);
}
样品请求正文:
{
"deptName" : "Sales",
"employees" : [
{
"fullName" : "Test",
"salary" : 1200.00
}
]
}
解决方案
您可以启用 hibernate show_sql 属性来检查执行保存操作时休眠正在触发的查询。也可以设置“hibernate.hbm2ddl.auto”来创建查看DDL语句。
IMO,您缺少 JoinColumn 名称和可为空的属性,它应该是这样的
@Entity
@Table(name = "EMPLOYEES")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String fullName;
private Double salary;
@ManyToOne
@JoinColumn(name ="department_id", nullable=false)
private Department department;
// getters and setters
}
推荐阅读
- python - 文件输出不同于终端输出
- shopify - 如何从 Shopify 基本计划的结帐页面中删除 Express Checkout 按钮?
- vba - 如何在调整行大小时将表单复选框设置为与单元格一起移动?
- mysql - 如何停止jdbc模板的浮点到十进制转换?
- ios - 启动 StartUpdatingLocation() 后,运行另一个方法 - 每次更新位置
- java - 错误崩溃实现“com.android.support:appcompat-v7:28.0.0”
- java - 如何从 Firestore 数据库中获取文档 ID
- python - 用于写入文件的 Python 函数
- c# - 如何在 C# 中将 DataTable 转换为数组?
- bar-chart - AnyLogic Barchart:如何从 0 以外的值开始