8

Spring Data REST(特にSpring HATEOAS)はRESTful ID(つまり、URI)をエンティティIDから切り離しているため、新しいオブジェクトを保存するときにそれらをリンクして戻すのに問題があります。https://github.com/SpringSource/spring-data-rest/issues/13で、このデカップリングに関する興味深い議論を参照してください。

クライアントアプリがTicket、関連付けられたTicketCategoryリソースを使用して新しいリソースを作成したいとします。TicketリモートのSpringDataRESTエンドポイントに対して投稿したい。はTicket新しいので、まだIDを持っていません。にはTicketCategoryIDがありますが、クライアントでは、上記の説明によると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上記の場合、チケットにはカテゴリフィールドが必須()であるため、これは望ましくありません。

4

2 に答える 2

12

https://github.com/SpringSource/spring-data-rest/wiki/Embedded-Entity-references-in-complex-object-graphsを見たことがありますか?

簡単に言うと、エクスポーターは、リレーションシップまたは管理対象オブジェクト(エクスポートされたリポジトリを持つ別のエンティティ)の代わりにリンクオブジェクトを見つけた場合、それらを参照解除します。

リンクされたプロパティが「カテゴリ」と呼ばれるとすると、次のような新しいチケットを作成できます。

POST /tickets
Content-Type: application/json

{
  "description": "Description of the ticket or issue",
  "category": {
    "rel": "category.Category",
    "href": "http://localhost:8080/categories/1"
  }
}
于 2012-10-23T13:30:54.380 に答える
11

見かけ上、Spring Data Restの新しいバージョンでは、これで次のことが可能になります。

POST /tickets
Content-Type: application/json

{
  "description": "Description of the ticket or issue",
  "category": "http://localhost:8080/categories/1"
}

Spring Data Rest2.0.0.RELEASEでのOliverGierkeのコメントによると、以前はRC1で機能していたコードが壊れています

于 2014-06-14T20:44:33.483 に答える