Spring Data REST(特にSpring HATEOAS)はRESTful ID(つまり、URI)をエンティティIDから切り離しているため、新しいオブジェクトを保存するときにそれらをリンクして戻すのに問題があります。https://github.com/SpringSource/spring-data-rest/issues/13で、このデカップリングに関する興味深い議論を参照してください。
クライアントアプリがTicket
、関連付けられたTicketCategory
リソースを使用して新しいリソースを作成したいとします。Ticket
リモートのSpringDataRESTエンドポイントに対して投稿したい。はTicket
新しいので、まだIDを持っていません。にはTicketCategory
IDがありますが、クライアントでは、上記の説明によるとURIです。したがって、を保存すると、SpringDataRESTはSpringDataJPAにTicket
渡しますTicket
が、これは気に入らないものです。SpringData JPAは、TicketCategory
エンティティIDがない場合は一時的であると見なします。
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
「関係の更新」というセクションがあり、HTTPPOSTを使用してエンティティ間の関係を確立するスキームについて説明しています。それが現在利用可能な唯一のアプローチであるかどうかはわかりませんが、このアプローチでは、最初の投稿で関連付けをnullのままにして、次の投稿で更新する必要があるようです。@NotNull
上記の場合、チケットにはカテゴリフィールドが必須()であるため、これは望ましくありません。