如何PUT只是与OneToMany关系的GETted实体

时间:2014-11-11 07:06:53

标签: spring-data-rest

例如,我有这些实体(来自restbucks示例的略微修改的实体):

class Order {
  // ID, getters etc
  @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
  Set<Item> items;
}

class Item {
  // ID, getters etc
  @ManyToOne
  Order order;
}

Repository 每个

现在,如果我GET /orders/1拥有一个简单字段为order的JSON,并在items属性中链接到该订单的_links

如果我然后修改某些字段并将PUT JSON重新调回/orders/1,那么所有字段都会被正确修改,但另外Set<Item> items会被清除。实际上他们删除了orphanRemoval = true。在hibernate日志中,我看到:

Hibernate: select order0_.id as id1_3_0_, order0_.location as location2_3_0_, order0_.ordered_date as ordered_3_3_0_, order0_.status as status4_3_0_ from rborder order0_ where order0_.id=?
Hibernate: select items0_.order_id as order_id8_3_0_, items0_.id as id1_1_0_, items0_.id as id1_1_1_, items0_.milk as milk2_1_1_, items0_.name as name3_1_1_, items0_.order_id as order_id8_1_1_, items0_.currency as currency4_1_1_, items0_.value as value5_1_1_, items0_.quantity as quantity6_1_1_, items0_.size as size7_1_1_ from item items0_ where items0_.order_id=?
Hibernate: update rborder set location=?, ordered_date=?, status=? where id=?
Hibernate: delete from item where id=

但如果我需要保存这些物品怎么办?我必须使用PATCH?如果我不想从客户端跟踪哪些字段发生变化,该怎么办?

例如:

  1. 从JS获取订单并将其分配给变量
  2. 对字段进行一些更改。不跟踪哪些字段已更改。
  3. PUT将订单更改回服务器。
  4. 现在订单没有商品。

1 个答案:

答案 0 :(得分:0)

您尝试做的是PATCH的预期目的。

  

扩展超文本传输​​协议(HTTP)的几个应用程序   需要一个功能来进行部分资源修改。现有的   HTTP PUT方法仅允许完全替换文档。这个   proposal添加了一个新的HTTP方法PATCH来修改现有的HTTP   资源。

http://tools.ietf.org/html/rfc5789