REST URI данных Spring против идентификатора объекта
Spring Data REST (и Spring HATEOAS в частности) отделяет идентификаторы RESTful (а именно, URI) от идентификаторов сущностей, и у меня возникают проблемы с их связью при сохранении новых объектов. Смотрите интересное обсуждение этой развязки на https://github.com/SpringSource/spring-data-rest/issues/13.
Предположим, что клиентское приложение хочет создать новый Ticket
ресурс со связанным TicketCategory
ресурс. Я хочу опубликовать Ticket
по отношению к удаленной конечной точке REST Spring Data. Ticket
еще не имеет идентификатора, так как он новый. TicketCategory
имеет идентификатор, но на клиенте это URI согласно обсуждению выше. Поэтому, когда я сохраняю Ticket
Spring Data REST передает Ticket
в Spring Data JPA, которая ему не нравится: Spring Data JPA считает, что TicketCategory
- не имеющий идентификатора объекта - является переходным:
org.hibernate.TransientPropertyValueException:
Not-null property references a transient value -
transient instance must be saved before current operation:
com.springinpractice.ch13.helpdesk.model.Ticket.category ->
com.springinpractice.ch13.helpdesk.model.TicketCategory
ОБНОВЛЕНИЕ: документация в
https://github.com/SpringSource/spring-data-rest/wiki/JPA-Repository-REST-Exporter
имеет раздел "Обновление отношений", в котором описывается схема, использующая HTTP POST для установления отношений между сущностями. Я не знаю, является ли это единственным подходом, доступным в настоящее время, но кажется, что этот подход потребовал бы оставить ассоциацию нулевой на начальном посте, а затем обновить его до следующего поста. В приведенном выше случае это было бы нежелательно, поскольку поле категории обязательно (@NotNull
) для билетов.
2 ответа
Вы смотрели на https://github.com/SpringSource/spring-data-rest/wiki/Embedded-Entity-references-in-complex-object-graphs?
Проще говоря, экспортер отменяет ссылку на объекты Link, если он находит их вместо отношения или управляемого объекта (другого объекта, который имеет экспортированный репозиторий).
Предполагая, что ваше связанное свойство называется "категория", вы можете создать новый билет, например:
POST /tickets
Content-Type: application/json
{
"description": "Description of the ticket or issue",
"category": {
"rel": "category.Category",
"href": "http://localhost:8080/categories/1"
}
}
В новых версиях Spring Data Rest это следует делать следующим образом:
POST /tickets
Content-Type: application/json
{
"description": "Description of the ticket or issue",
"category": "http://localhost:8080/categories/1"
}
Согласно комментарию Оливера Гирке на Spring Data Rest 2.0.0.RELEASE ломает код, ранее работавший с RC1