Podano poniżej relację jeden-do-wielu z Department
do Employee
.Scalanie zarządzanego obiektu po stronie @ManyToOne
Department (rodzic):
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Employee> employeeList = new ArrayList<Employee>(0);
pracownika (dziecko):
@JoinColumn(name = "department_id", referencedColumnName = "department_id")
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
private Department department;
Scalanie zarządzanego podmiotu (child) Podobnie jak następuje (używając CMT w EJB),
Employee employee = entityManager.find(Employee.class, 1L);
employee.setDepartment(department); // department is supplied by a client.
employee.setEmployeeName("xyz");
entityManager.merge(employee);
nie aktualizuje odpowiedniego wiersza pracownika w tabeli bazy danych. Zdarza się tylko wtedy, gdy CascadeType.MERGE
zostanie usunięty z relacji podrzędnej @ManyToOne
w Employee
.
Dlaczego wiersz w tabeli nie jest aktualizowany? Jaki jest wyłącznie cel CascadeType.MERGE
dotyczący tego przykładu?
Aktualnie używam EclipseLink 2.6.0 z JPA 2.1.
Myślę, że jest to błąd w EclipseLink. Czy próbowałeś już innych wersji EclipseLink lub Hibernate? Celem 'CascadeType.MERGE' w tym przykładzie jest, jak zwykle, wyzwolenie również' CascadeType.MERGE' w polu 'department'. –
Nawet usunięcie tego wiersza 'entityManager.merge (pracownik);' powinno zaktualizować wiersz w bazie danych, ponieważ jest to obiekt zarządzany.Usunięcie tej linii powoduje jednak, że cała lista pracowników powiązanych z 'Wydziałem' (' employee.setDepartment (department);) zostanie ponownie wstawiona, chyba że 'CascadeType.PERSIST' zostanie usunięty z' @ ManyToOne' w 'Pracownik '. ** W Hibernate działa to doskonale. ** Dlatego jest to błąd na pewno w EclipseLink. – Tiny
Mimo to stworzyłem błąd na [Bugzilla] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=470697). – Tiny