Как сослаться на сущность по id в запросе

Я настраиваю приложение Spring Boot, я уже настроил сущности и подключился к базе данных, и теперь я хочу реализовать сохранение данных из остального API. Скажем, у меня есть такие сущности

@Entity
class A {
   ...
   private String name;
   @OneToOne
   private B b; 
   ...
} 

и я хочу иметь возможность отправить этот запрос на создание сообщения «A», когда существует B с идентификатором 1. Результатом этого запроса будет то, что A связан с B.

{
   "name":"name Of A"
   "B": {
      "id":1
   }
}

Возможно ли это с помощью инструментов, предоставленных Spring Boot, или это какой-то нетрадиционный способ ведения дел. Заранее спасибо.

Я не понял вашего вопроса, на самом деле, если вы просто вернете свою сущность A из @RestController, она будет правильно анализировать ее в JSON, как ваш пример, у вас есть какие-то проблемы с этим?

nullptr 26.04.2019 22:02

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

jazzimier 27.04.2019 13:07

Это происходит потому, что после сериализации у вас нет ни A, ни B в контексте Hibernate, вы должны либо найти ссылку, как указано madz, либо получить весь объект в базе данных. Я не рекомендую вам использовать объекты базы данных напрямую для сериализации, вместо этого вы должны использовать DTO.

nullptr 28.04.2019 04:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
789
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Насколько мне известно, не существует встроенного решения для простого сопоставления этого json с сущностью, которая будет сохранена непосредственно в репозитории.

Вам нужно использовать @RequestBody для аргумента A в остальном контроллере, а затем вручную использовать entityManager.getReference(id_of_b) для установки объекта B объекта A. Затем вы можете использовать repository.save ...

Если вы хотите сделать его лучше, вам нужно написать свой собственный HandlerMethodArgumentResolver, реализовать и зарегистрировать StdDesrializer из Jackson, чтобы определить отношения @OneToOne или @ManyToOne, а затем получить идентификатор отношения от Джексона и установить его с помощью entityManager.getReference(id_of_b), как указано выше.

Таким образом, полученный объект будет готов к сохранению непосредственно в репозитории.

Другие вопросы по теме