обратная сторона (департамент):Требуется ли удалить объект из его обратной коллекции, когда ссылка на родителя уже установлена в значение null в сущности при слиянии?
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
private List<Employee> employeeList = new ArrayList<Employee>(0);
Обладание сторона (Сотрудник):
@JoinColumn(name = "department_id", referencedColumnName = "department_id")
@ManyToOne(fetch = FetchType.LAZY)
private Department department;
Способ присоединения к Employee
объект, поставляемый клиентом, имеющий нулевое Department
в нем:
public Employee update(Employee employee) {
Department department = employee.getDepartment();
if (department == null) {
Employee managedEmployee = entityManager.find(Employee.class, employee.getEmployeeId());
// Obtain the original Employee entity which may still have its Department intact.
if (managedEmployee == null) {
throw new EntityNotFoundException();
}
Department managedDepartment = managedEmployee.getDepartment();
if (managedDepartment != null) {
managedEmployee.getDepartment().getEmployeeList().remove(managedEmployee);
// Removing an Employee entity from the list on the inverse side,
// since it will no longer be pointing to Employee after Employee is merged.
}
return entityManager.merge(employee);
}
}
Поставляется Employee
является отдельным объектом. Предположим, что Department
является необязательным для Employee
s, и, следовательно, имеется нулевой внешний ключ (таким образом, ON DELETE SET NULL
указан в внутренней системе).
Нужно явно удалить Employee
объект, как показано на update()
выше способом из списка сотрудников на обратной стороне отношения (Department
), когда входящий в комплект поставки Employee
не содержит Department
(потому что он уже установленным на нуль клиентом при редактировании объекта Employee
) перед слиянием поставленного объекта Employee
?
Я думаю, провайдер сохранит ссылку Employee
в списке сотрудников на обратной стороне отношений, в противном случае болтается.
Был этот [предыдущий вопрос] (http://stackoverflow.com/q/31769284/1391249) с тем же содержимым, но я случайно забыл удалить 'cascade = CascadeType.ALL' и' orphanRemoval = true' на обратная сторона отношения, изменяющая все определение вопроса. – Tiny
Как вы относитесь к основной транзакции метода 'update'? Вы используете расширенное распространение контекста постоянства? Вы извлекаете и/или модифицируете экземпляры сущностей, которые имеют значение до и/или после вызова метода «update»? Как? – Guillermo
Это транзакционный объект EntityManager в EJB (по умолчанию используется '@PersistenceContext (type = PersistenceContextType.TRANSACTION)'). '@PersistenceContext (type = PersistenceContextType.EXTENDED)' не применяется к сессионным компонентам без состояния. Сохранение состояния с использованием подробных сессионных битов состояния для такого рода операций CRUD абсолютно избыточно. EJB потребляются JSF, где по мере необходимости сущности изменяются в соответствии с бизнес-требованиями и повторно передаются в соответствующий EJB для их распространения в базовую базу данных. Я не уверен, как это связано. – Tiny