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




Насколько мне известно, не существует встроенного решения для простого сопоставления этого json с сущностью, которая будет сохранена непосредственно в репозитории.
Вам нужно использовать @RequestBody для аргумента A в остальном контроллере, а затем вручную использовать entityManager.getReference(id_of_b) для установки объекта B объекта A. Затем вы можете использовать repository.save ...
Если вы хотите сделать его лучше, вам нужно написать свой собственный HandlerMethodArgumentResolver, реализовать и зарегистрировать StdDesrializer из Jackson, чтобы определить отношения @OneToOne или @ManyToOne, а затем получить идентификатор отношения от Джексона и установить его с помощью entityManager.getReference(id_of_b), как указано выше.
Таким образом, полученный объект будет готов к сохранению непосредственно в репозитории.
Я не понял вашего вопроса, на самом деле, если вы просто вернете свою сущность
Aиз@RestController, она будет правильно анализировать ее в JSON, как ваш пример, у вас есть какие-то проблемы с этим?