Dato di seguito una relazione uno-a-molti da Department
a Employee
.Unione di un'entità gestita sul lato @ManyToOne
Dipartimento (genitore):
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Employee> employeeList = new ArrayList<Employee>(0);
Employee (bambino):
@JoinColumn(name = "department_id", referencedColumnName = "department_id")
@ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
private Department department;
Unione di entità gestita (bambino) nel modo seguente (utilizzando CMT in EJB),
Employee employee = entityManager.find(Employee.class, 1L);
employee.setDepartment(department); // department is supplied by a client.
employee.setEmployeeName("xyz");
entityManager.merge(employee);
non aggiorna la riga corrispondente del dipendente nella tabella del database. Succede solo quando CascadeType.MERGE
viene rimosso dalla relazione figlio @ManyToOne
in Employee
.
Perché la riga della tabella non viene aggiornata? Qual è l'unico scopo di CascadeType.MERGE
in merito a questo esempio?
Attualmente sto utilizzando EclipseLink 2.6.0 con JPA 2.1.
Penso che sia un bug in EclipseLink. Hai provato altre versioni di EclipseLink o Hibernate? Lo scopo di "CascadeType.MERGE" in questo esempio è, come di solito, anche attivare un 'CascadeType.MERGE' nel campo' dipartimento'. –
Anche rimuovendo questa riga 'entityManager.merge (impiegato);' dovrebbe aggiornare la riga nel database, poiché è un'entità gestita.Rimuovendo questa riga, tuttavia, l'intero elenco di dipendenti associato a un 'Department' (' employee.setDepartment (dipartimento); ') deve essere reinserito più volte a meno che' CascadeType.PERSIST' sia rimosso da '@ ManyToOne' in' Employee '. ** Questo va perfettamente bene su Hibernate. ** Pertanto, è sicuramente un bug in EclipseLink. – Tiny
Ho creato un problema su [Bugzilla] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=470697). – Tiny