OneToMany 映射在 Spring Boot + Hibernate 中不起作用

OneToMany mapping not working in Spring Boot + Hibernate

我正在开发 Spring Boot + Hibernate 应用程序。我想知道如何保存 OneToMany 关系,包括外键。

我有 2 个 类 具有一对多关系的员工和地址。

@Entity
public class Employee {

    @Id
    @GeneratedValue
    private int empId;
    private String name;
    private String designation;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "employee",fetch=FetchType.EAGER)
    private List<Address> addresses = new ArrayList<>();

    public List<Address> getAddresses() {
        return addresses;
    }

    public void setAddresses(List<Address> addresses) {
        this.addresses = addresses;
    }
}


@Entity
public class Address {

    @Id
    @GeneratedValue
    private int addressID;
    private String city;
    private String country;

    @ManyToOne(cascade = CascadeType.ALL,fetch=FetchType.LAZY)
    @JoinColumn(name = "empId")
    private Employee employee;

    public Employee getEmployee() {
        return employee;
    }

    public void setEmployee(Employee employee) {
        this.employee = employee;
    }
}

道代码:

@Repository
public class EmployeeDao {

    @Autowired
    private SessionFactory sessionFactory;

    public Employee save(Employee employee) {
        Session session = getSession();
        session.persist(employee);      
        return employee;

    }

    private Session getSession() {
        return sessionFactory.getCurrentSession();
    }
}

当我尝试使用 json Post 请求保存数据时:

{
  "name": "Kamal Verma",
  "designation": "SAL1",
  "addresses": [
    {
      "city": "Noida",
      "country": "India"
    }
  ]
}

它工作正常,没有任何错误,但在地址 table 的数据库中,EMPID 为空。

请告诉我我做错了什么,因为地址 table 中的外键没有被保存。

谢谢, 卡马尔

您必须在地址 class 中设置 'employee' 字段。

将您的员工 class 中的 setter 更新为:

public void setAddresses(List<Address> addresses) {
    this.addresses.clear();

    for (Address address: addresses) {
      address.setEmployee(this);
      this.addresses.add(address);
    }
}

在保存 Employee 对象之前,所有地址对象都必须设置 employ 引用,这样 hibernate 才能在地址表中填充 empId。

@Autowired
private SessionFactory sessionFactory;

public Employee save(Employee employee) {
    Session session = getSession();
    for(Address address: employee.getAddresses()){
        address.setEmployee(employee); //Set employee to address.
    }
    session.persist(employee);      
    return employee;

}

private Session getSession() {
    return sessionFactory.getCurrentSession();
}