Код, который вы пометили как «рабочий», приводит к гипотезе о том, что отношение «Вагон - Поезд» составляет fetch="EAGER"
Этот код "не работает" и "одна транзакция":
@Transactional
public JsonTrain delete(Long id) {
Wagon wagon = wagonRepository.getOne(id);
isSafeForDelete(wagon);
wagonRepository.delete(wagon);
return modelMapper.map(wagon.getTrain(), JsonTrain.class);
}
сначала загружает вагон из хранилища (Wagon wagon = wagonRepository.getOne(id)
), затем пометьте его как удаленный (wagonRepository.delete(wagon)
), см .: Жизненный цикл объекта JPA . Наконец, ссылка Поезд (wagon.getTrain()
) передается моделирующему. Из-за гипотезы, высказанной в начале моего ответа, поезд был загружен из базы данных перед удалением Вагона. Чтобы удалить вагон, попробуйте также удалить его из списка вагонов поездов.
Код, который вы пометили как «рабочий», имеет семантику, в которой каждая операция с репозиторием выполняется в отдельной транзакции (Wagon wagon = wagonRepository.getOne(id)
и wagonRepository.delete(wagon)
). Поэтому, когда вы передаете поезд на модель-картограф, вагон уже удален из базы данных - но - поскольку вагон с поездом был загружен перед удалением, удаленный вагон также должен быть сопоставлен с JsonTrain (при условии, что JsonTran имеет список JsonWagon :)).