Как обновить только подмножество полей и обновить хранилище? - PullRequest
0 голосов
/ 10 октября 2019

Я делаю приложение с весенней загрузкой, и я ищу, чтобы обновить существующую запись в БД через мой сервис и контроллер. В моем слое обслуживания у меня есть метод ниже. Поэтому я извлекаю поля, связанные с caseID, создаю модель сопоставления, которая сопоставляет мой класс объекта сущности с моим VO, а затем сопоставляет полученные данные с моим DTO. Затем я сохраняю свой репозиторий. Цель состоит в том, чтобы добавить только те поля, которые я указал в своем сообщении req, т.е. если я хочу обновить только 1 поле из 20, оно обновляет это поле, а остальное остается нетронутым. Нижеследующее успешно выполняется, но поле, указанное в моем сообщении с запросом в почтальоне, не обновляется в БД. Почему это? Я попытался отобразить разные объекты и сохранить разные переменные в хранилище, но, похоже, ничего не обновляет БД.

public StoredOutboundErrorCaseVO updateCase(OutboundErrorCaseVO outboundErrorCaseVO, Long caseNumber) {
    OutboundErrorCaseData existingCaseData = ErrorCaseDataRepository.findById(caseNumber).get();
    ModelMapper mm = new ModelMapper();
    mm.getConfiguration().setAmbiguityIgnored(true);
    OutboundErrorCaseData uiOutboundErrorCaseData = mm.map(outboundErrorCaseVO,
            OutboundErrorCaseData.class);
    mm.map(existingCaseData, uiOutboundErrorCaseData);
    ErrorCaseDataRepository.save(uiOutboundErrorCaseData);
    return mm.map(uiOutboundErrorCaseData, StoredOutboundErrorCaseVO.class);
}

Контроллер - код для краткости опущен, метод POST (я обычно использую PUT для обновлений, но я все еще могу использовать POST)

    StoredOutboundErrorCaseVO updatedCase = outboundErrorService.updateCase(outboundErrorCaseVO,
            caseNumber);

Repo

    @Repository
public interface OutboundErrorCaseDataRepository extends JpaRepository<OutboundErrorCaseData, Long> {

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Я создал рабочее решение, хотя я понимаю, что его можно улучшить, оно, безусловно, работает. Единственным недостатком является то, что мне нужно указать все поля, которые могут быть обновлены, в идеале мне нужно решение, которое принимает n полей и обновляет запись.

OutboundErrorCaseData existingCaseDta = ErrorCaseDataRepository.findById(caseNumber).get();
    if (outboundErrorCaseVO.getChannel() != null) {
        existingCaseDta.setChannel(outboundErrorCaseVO.getChannel());
    }
ErrorCaseDataRepository.save(existingCaseDta);
    ModelMapper mm = new ModelMapper();
    return mm.map(existingCaseDta, StoredOutboundErrorCaseVO.class);
0 голосов
/ 10 октября 2019

Вы получаете данные и передаете их в existingCaseData и сохраняете uiOutboundErrorCaseData. Поэтому я предполагаю, что Hibernate добавляет новый объект в базу данных с новым идентификатором и обновленным значением. Это, конечно, зависит от определения вашей модели. Особенно id.

Я также думаю, что Hibernate не позволит вам сохранить uiOutboundErrorCaseData с тем же идентификатором, если у вас уже есть объект в сеансе Hibernate, связанный с этим идентификатором. Итак, почему бы вам не обновить existingCaseData новым значением и сохранить его обратно.

...