【发布时间】:2016-10-29 15:25:30
【问题描述】:
无法保存子对象引用。
Employee 父对象包含子 employee_detail,它还定义了一个 @ManyToOne 来保存 Address 对象。
表结构
EMPLOYEE
ID BIGINT(20) NOT NULL AUTO_INCREMENT
NAME VARCHAR(100) NOT NULL
EMPLOYEE_DETAIL
ID BIGINT(20) NOT NULL AUTO_INCREMENT
EMPLOYEE_ID BIGINT(20) NOT NULL
ADDRESS_ID BIGINT(20) NOT NULL
实体
@Entity
@Table(name = "employee")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "employee", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private List < EmployeeDetail > employeeDetails = new ArrayList < > ();
public void addEmployeeDetail(EmployeeDetail ed) {
employeeDetails.add(ed);
ed.setEmployee(this);
}
}
@Entity
@Table(name = "employee_detail")
public class EmployeeDetail {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@ManyToOne(optional = false, cascade = CascadeType.PERSIST)
@JoinColumn(name = "employee_id")
private Employee employee;
@ManyToOne(optional = false, cascade = CascadeType.PERSIST)
@JoinColumn(name = "address_id")
private Address address;
}
在 REST 控制器方法中:
public void saveEmployee(@RequestBody Employee employee)
{
EmployeeDetail employeeDetail = new EmployeeDetail();
employeeDetail.setEmployee(employee);
for(EmployeeDetail ed : employee.getEmployeeDetails())
{
Address address = addressService.findOne(ed.getAddress().getId());
employeeDetail.setAddress(address);
}
employee.addEmployeeDetail(employeeDetail);
//SAVE
employeeService.create(employee);
}
例外:
nested exception is org.hibernate.PersistentObjectException: detached entity passed to persist: com.abc.Address
我无法使用子表 EmployeeDetail 保存地址详细信息。这里有什么问题?
【问题讨论】:
-
您不能持久化分离的实例,在更新数据库之前获取
Address的持久化实例。 -
抱歉,我更新了地址检索代码。但还是同样的问题。
-
cascade = CascadeType.PERSIST在ManyToOne中的意思是:当持久化EmployeeDetail时,还要持久化这个字段...如果地址存在并且试图持久化,一个'org.hibernate.PersistentObjectException' 是抛出... -
我删除了地址字段中定义的大小写注释。现在得到 com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'employee_id' cannot be null
-
你必须先保存
Employee,然后用刚刚持久化的Employee创建EmployeeDetail
标签: spring spring-data spring-data-jpa