Ниже приведено соотношение «один-ко-многим» от Department
до Employee
.Объединение управляемого объекта на стороне @ManyToOne
отдела (родитель):
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Employee> employeeList = new ArrayList<Employee>(0);
Сотрудника (ребенок):
@JoinColumn(name = "department_id", referencedColumnName = "department_id")
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
private Department department;
Объединение управляемого объекта (ребенок), как показано ниже (с использованием СМТ в EJB),
Employee employee = entityManager.find(Employee.class, 1L);
employee.setDepartment(department); // department is supplied by a client.
employee.setEmployeeName("xyz");
entityManager.merge(employee);
не обновляет соответствующую строку сотрудника в таблице базы данных. Это происходит только тогда, когда CascadeType.MERGE
удаляется с ребенка @ManyToOne
в Employee
.
Почему обновляется строка в таблице? Какова единственная цель CascadeType.MERGE
в отношении этого примера?
Я в настоящее время использую EclipseLink 2.6.0 с JPA 2.1.
Я думаю, что это ошибка в EclipseLink. Вы пробовали другие версии EclipseLink или Hibernate? Назначение 'CascadeType.MERGE' в этом примере - это, как правило, инициировать также' CascadeType.MERGE' в поле 'department'. –
Даже удаление этой строки 'entityManager.merge (employee);' должно обновлять строку в базе данных, поскольку это управляемый объект.Однако удаление этой строки приводит к тому, что весь список сотрудников, связанных с 'Department' (' employee.setDepartment (department); '), повторно вводится повторно, если только' CascadeType.PERSIST' не удален из '@ ManyToOne' в' Employee '. ** Это отлично подходит для Hibernate. ** Поэтому в EclipseLink это ошибка. – Tiny
В любом случае я создал проблему на [Bugzilla] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=470697). – Tiny