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();
}
我正在开发 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();
}