我创建了员工和部门实体。它们具有双向的多对一和一对多关系。
使用rest客户端,我添加了部门和员工。
添加部门:
{
"name":"IT"
}
添加员工:
{"name": "Emp01" ,
"address":
{
"street" :"Street01" ,
"city" :"City01" ,
"state" :"State01" ,
"country" :"Country01"
},
"department":{"id":"1"}
}
现在,我想通过关联现有员工来添加一个新部门。
{
"name":"Admin",
"employees":
[{
"id":3
}]
}
现在,部门添加成功,但员工表没有正确更新。除id外,其他字段均为空白。理想情况下,hibernate应该用最新的部门id更新员工。请告诉我这里可能缺少什么?谢谢。
员工.java
package com.empcatalogue.model;
import javax.persistence.CascadeType;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@Embedded
private Address address;
@ManyToOne(cascade = CascadeType.MERGE)
private Department department;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
部门.java
package com.empcatalogue.model;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "department", fetch = FetchType.EAGER)
private List<Employee> employees = new ArrayList<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
employeerepository.java文件
...
...
...
public void addEmployee(Employee emp) {
Session session = RepoManager.getSessionFactory().openSession();
try {
session.beginTransaction();
session.save(emp);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
} finally {
session.close();
}
}
departmentrepository.java文件
...
...
...
public void addDepartment(Department department) {
Session session = RepoManager.getSessionFactory().openSession();
try {
session.beginTransaction();
session.save(department);
session.getTransaction().commit();
} catch (Exception e) {
session.getTransaction().rollback();
} finally {
session.close();
}
}
1条答案
按热度按时间7gyucuyw1#
你用的是
javax.persistence
包,但您将问题标记为Hibernate
.Hibernate
只是jpa(javapersistenceapi)的实现之一。即使是Hibernate
网页推荐使用jpa。除非维护遗留代码,否则最好使用jpaapi来持久化和获取实体。现在回答你的问题:
现在,我想通过关联现有员工来添加一个新部门。
为了能够持久化和更新实体,您应该遵循以下步骤(代码行只是pseodo代码):
创建的示例
Department
实体:获取现有的
Employee
事务中数据库中的实体:将实体示例关联在一起:
员工:
您应该在事务中执行所有这些操作,并且一切都应该按预期工作。