Данные двух организаций Department
и Employee
, образующие отношения «один ко многим» от Department
до Employee
.Каскадные типы в JPA
Поскольку отношения довольно интуитивно понятны, я оставляю классы сущностей.
В Department
:
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY)
private List<Employee> employeeList = new ArrayList<Employee>(0);
В Employee
:
@ManyToOne(fetch = FetchType.LAZY)
private Department department;
Пожалуйста, обратите внимание, что я нигде не упоминается cascade = {CascadeType.MERGE}
хотя следующие отношения будут объединены с обеих сторон (владеющим и обратных сторон).
Employee employee = entityManager.find(Employee.class, 18L);
employee.setEmployeeName("zz");
Department department = employee.getDepartment();
employee.setDepartment(department);
department.setDepartmentName("e");
department.setLocation("e");
entityManager.merge(employee);
При объединении Employee
, Department
также объединены.
Наоборот, в этом следующем случае
Department department = entityManager.find(Department.class, 1L);
List<Employee> employeeList = department.getEmployeeList();
for(Employee e:employeeList) {
if(e.getEmployeeId().equals(27L)) {
e.setEmployeeName("xxx");
}
}
// No further EntityManager operation(s) here.
Новые значения, установленные на Employee
, например, непосредственно объединены в соответствующую основную базу данных.
OpenJPA От:
CascadeType.MERGE
: При слиянии состояния лица, а также объединять объекты , проведенных в этой области.
От EclipseLink Wiki:
MERGE - Если владеющее объект слиты, слияние каскадно к цели ассоциации.
От JPA Wiki Book:
MERGE
- каскадный вEntityManager.merge()
операции. Если для родителя вызываетсяmerge()
, тогда ребенок также будет объединен. Этот обычно должен использоваться для зависимых отношений. Обратите внимание, что этот влияет только на каскадирование слияния, сама ссылка отношения всегда будет объединена. Это может стать серьезной проблемой, если для ограничения сериализации используются переходные переменные, вам может понадобиться вручную слияние или сбросtransient
отношений в этом случае. Некоторые поставщики JPA предоставляют дополнительные операции слияния.
Что касается вышеприведенных тестовых примеров, я не совсем понимаю, когда необходимо или полезно использовать cascade = {CascadeType.MERGE}
. Каково использование cascade = {CascadeType.MERGE}
в этом случае?
Как эти тестовые кейсы сливаются Department
и Employee
соответственно без использования cascade = {CascadeType.MERGE}
?
Я в настоящее время на EclipseLink 2.6.0.
Я вижу, что отсутствие 'cascade = {CascadeType.MERGE}' не отличается от этого. Когда это нужно? – Tiny
Это имеет значение, когда вы фактически объединяете ** отдельную ** сущность. Если у вас есть отдельный отдел, в котором есть отдельные сотрудники, и вы объедините отдел, сотрудники также будут объединены или нет, в зависимости от продолжительности каскада. –