首页 > 解决方案 > 有没有办法在 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
        }
    ]
}

标签: springhibernatejpa

解决方案


您可以启用 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
}

推荐阅读