2014-11-11 1 views
2

Например, у меня есть эти объекты (немного модифицированные сущности из restbucks примера):Как PUT только GETted сущности с OneToMany отношения назад

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 то есть JSON с простыми полями order и ссылки на items этого порядка в _links атрибута.

Если я затем изменю некоторые поля и просто PUT, то JSON вернется к /orders/1, тогда все поля изменены корректно, но дополнительно Set<Item> items очищается. Фактически они удалялись как orphanRemoval = true. В спящем режиме я вижу:

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 с измененным заказом.

В настоящее время в заказе нет товаров.

+0

Там нет необходимости отслеживать, какие поля изменились при использовании пластыря. – zeroflagL

ответ

0

Что вы пытаетесь сделать, это намеченная цель PATCH.

В некоторых приложениях, расширяющих протокол передачи гипертекста (HTTP) , требуется функция частичной модификации ресурсов. Существующий метод HTTP PUT позволяет полностью заменить документ. Это предложение добавляет новый HTTP-метод PATCH для изменения существующего ресурса HTTP .

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

+0

Вопрос о том, как использовать PUT с ** spring-data-rest **. Я знаю, что такое PATCH, но с весенним-данным-отдыхом мы вообще не можем PUT? Потому что мы всегда GET JSON без отношений во встроенном объекте. – djxak

+0

@djxak, какую версию Spring-Data-Rest вы используете? Я могу сделать как PUT, так и PATCH родительскому/1 без потери родительских детей. – gyoder

+0

Я пробовал Spring-data-rest 2.2.0.RC1. На самом деле я попытался сыграть с проектом [spring-restbucks] (https://github.com/olivergierke/spring-restbucks), но изменил однонаправленное сопоставление на двунаправленный и разоблачил 'ItemRepository' для неинъекции элементов по порядку. Теперь, если я 'GET/orders/1', а затем PUT только то, что я получаю к тому же URI, то элементы этого порядка все удаляются. – djxak

Смежные вопросы