У меня есть организация сотрудника с PK EMP_ID. Сотрудник имеет сбор ребенка в качестве рабочих мест (таблица EMP_LEAVES). У него есть идентификатор, emp_id, deave_date, поле для комментариев.
У меня есть @onetomany (cascade = cascadetype.all, mappenby = "Сотрудник", OrphanRemoval = true) на сборе использования. /> Когда я сохраняю сотрудника, я выполняю следующее < /p>
Очистить коллекцию. < /li>
Добавить новое использование, созданное из использования, с использованием mapstruct (с нулевым идентификатором) < /li>
Сохраняет персонал < /li>
< /ol>
. строка существует в БД. Он бросает уникальное исключение ограничения. < /p>
public interface EmployeeMapper {
static class EmployeeContext {
Map leaveMap;
}
@ObjectFactory
default EmployeeLeave createLeave(LeaveDto leaveDto, @Context EmployeeContext context) {
return Objects.requireNonNullElseGet(context.leaveMap.get(leaveDto.getId()), EmployeeLeave::new);
}
void map(EmpployeeDto empDto, @MappingTarget Employee emp, @Context EmployeeContext context);
default Employee mapDtoToEntity(EmployeeDto empDto, Employee emp) {
EmployeeContext context = new EmployeeContext();
context.leaveMap = emp.employeeLeaves().stream().collect(Collectors.toMap(EmployeeLeave::getId, Function.identity()));
map(empDto, emp, context);
emp.getEmployeeLeaves().foreach(l -> l.setEmployee(emp));//assign parent
return emp;
}
}
< /code>
Я называю mapdtotoentity с управляемой сущностью. Он добавляет любые вновь созданные листья или уже существующие листья. Затем я называет Merge на менеджере объектов. Теперь, когда в пользовательском интерфейсе эта дата отпуска изменилась на 2 мая 2025 года, и добавлена новая строка отпуска 1 мая 2025 года. Когда сотрудник будет сохранен, HibeerNate сначала попытается вставить отпуск без идентификатора, то есть 1 мая 2025 года. Но в БД уже существует ряд, и он бросает исключение
Подробнее здесь: https://stackoverflow.com/questions/797 ... -exception