2015-06-03 3 views
0

Данные двух организаций 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.

ответ

2

Что вам не хватает, является фундаментальной особенностью JPA: каждое изменение, внесенное в управляемый объект, равно автоматически сохранено в базе данных. Не нужно звонить merge() или что-то еще. Вы открываете транзакцию, получаете сущности и изменяете их, а затем фиксируете транзакцию, и это все, что вам нужно для изменения базы данных.

merge() используются для копирования изменений из отдельных лица своему управляемого собрата.

+0

Я вижу, что отсутствие 'cascade = {CascadeType.MERGE}' не отличается от этого. Когда это нужно? – Tiny

+0

Это имеет значение, когда вы фактически объединяете ** отдельную ** сущность. Если у вас есть отдельный отдел, в котором есть отдельные сотрудники, и вы объедините отдел, сотрудники также будут объединены или нет, в зависимости от продолжительности каскада. –