Невозможно сохранить ссылку на дочерний объект.Исключение JPA/Hibernate: удаленный объект передан для сохранения при сохранении дочернего отношения @ManyToOne
Материнский родительский объект содержит дочерний 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;
}
В методе РЕСТ контроллера:
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. Что здесь не так?
Вы не можете сохранить отдельный экземпляр, получить постоянный экземпляр «Адрес» перед y ou обновить базу данных. –
Извините, я обновил код поиска адреса. Но все та же проблема. – FakirTrappedInCode
'cascade = CascadeType.PERSIST' в' ManyToOne' означает: когда упорство 'EmployeeDetail' также сохраняется в этом поле ... если существующий адрес и пытается быть сохраненным, возникает ошибка'org.hibernate.PersistentObjectException '. . –