例如,我有这些实体(来自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
?如果我不想从客户端跟踪哪些字段发生变化,该怎么办?
例如:
现在订单没有商品。
答案 0 :(得分:0)
您尝试做的是PATCH的预期目的。
扩展超文本传输协议(HTTP)的几个应用程序 需要一个功能来进行部分资源修改。现有的 HTTP PUT方法仅允许完全替换文档。这个 proposal添加了一个新的HTTP方法PATCH来修改现有的HTTP 资源。