Как правильно обновить сущности, используя REST и JPA / Hibernate - PullRequest
0 голосов
/ 24 апреля 2018

Проблема: у меня есть объект Document, в котором есть множество столбцов, сопоставления «один к одному», «один ко многим» и «многие ко многим» с некоторыми другими объектами. Пример: Документ: Я бы, заглавие, тело, авторы, зрители, ...

Используя REST, я хочу обновить какой-то конкретный документ, контроллер получает сериализованный объект Document, вызывая метод слияния EntityManager, сохраняя нулевые результаты в базе данных, если контроллер получил, например, только тело, тогда я хочу обновить только тело, но объединить удаляет записи для заголовка, авторов и зрителей и т. д.

Я понимаю, что это стандартное поведение EntityManager, но я спрашиваю, какой метод наиболее предпочтителен для обновления сущностей без получения всей сущности из внешнего интерфейса или какой-либо другой конечной точки. Должен ли я загружать объект из базы данных, используя полученный идентификатор, вручную установить все поля, а затем сохранить в базе данных или использовать другой метод.

У меня нет проблем с написанием вручную всех установщиков для копирования изменений, но сущности действительно большие по размеру с большим количеством связей. Запрашиваемая наилучшая практика в этом случае.

Я знаю о DTO, но мне нужен альтернативный подход при использовании сущностей для контроллеров и методов обслуживания.

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Есть два варианта: запрос на обновление, который работает нормально, но вы можете чувствовать вы теряете некоторые функции гибернации и простоту кода. Иначе вы можете сделать это в режиме гибернации, как показано ниже

   AuditorBean auditorBean = (AuditorBean) session.get(AuditorBean.class, AuditorBean.getId());
    auditorBean.setFirstName("aa");
    auditorBean.setLatName("bb");
    auditorBean.setTrainLevel("ISO");
    auditorBean.setAccessLevel(4);

Здесь вы не должны вызывать какие-либо методы, такие как saveOrUpdate () или merge (). объект связан с транзакцией, поэтому объект автоматически сбрасывается и фиксируется в конце транзакции.

0 голосов
/ 24 апреля 2018

Для частичного обновления сущности вам нужно будет использовать критерии api или jpql ... если вы используете более старые версии без обновления критериев или старый анализатор запросов, где обновление jpql не разрешено, вам сначала придется читать из базы данных, обновить, затем вставить еще раз .... вы также можете использовать updatable=false для столбцов, которые должны быть установлены только при создании (например, CREATION_DATE), и в hibernate есть также замечательная функция @DynamicUpdate, которую я не пробовал, но выглядит великолепно ... Он только обновляет измененное поле ( проверьте сообщение Влада здесь ) ... относительно DTO DP, я, возможно, вам всегда придется использовать, если вы хотите скрыть / изменить некоторые данные от клиента независимо от того, как вы храните данные ... и это всегда хороший способ разделить проблемы (но сопровождается головной болью сопоставления между объектами домена и DTO, которая значительно освобождается благодаря пружинным конвертерам )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...