REST URI данных Spring против идентификатора объекта
Spring Data REST (и Spring HATEOAS в частности) отделяет RESTful ID (а именно, 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
) для билетов.