В моем проекте я использую объект типа A, который имеет отношение OneToMany (orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER) к объектам типа B. Мне нужно SpringDataRest (SDR) для хранения полного объекта A с его объектами B (дочерними), используя один запрос POST. Я попробовал несколько комбинаций в SDR, единственная, которая сработала для меня, это создать @RepositoryRestResource для объекта A и создать @RepositoryRestResource также для объекта B, но отметьте это (B) как exported=false (если бы я вообще не создавал репозиторий из объекта B, это не сработало бы -> просто A объект будет сохранен в одном запросе POST, но не его дочерние элементы (@отношения OneToMany) типа B; тот же результат произойдет, если exported=false опущен для репозитория B) . Это нормально и единственный способ добиться этого (один запрос POST с сохранением всех объектов сразу)?
Причина, по которой я спрашиваю, в моем предыдущем примере заключается в том, что я должен (я хотел бы) контролировать «жизненный цикл» всех объектов, используя репозиторий A. Меня это устраивает, потому что отношение A->B является композицией (B не существует вне A ). Но у меня есть серьезная проблема с редактированием (также удалением) одного определенного объекта типа B с помощью SDR с использованием его родительского репозитория (поскольку у объекта B нет экспортированного собственного репозитория). Может быть, это невозможно по определению. Я пробовал эти решения:
- PATCH для "/A/1/B/2" не работает -> метод не разрешен (в заголовках стоит "Allow: GET, DELETE") -> так что о PUT не может быть и речи
- Json Patch также не будет работать - PATCH для "/A/1" с использованием json patch content-type [{"op": "add", "path": "/B/2", ....}] -> «нет такого индекса в целевом массиве» - потому что Json Patch использует скаляр «2» после «массива» в качестве индекса для своего массива. Это непрактично в мире Java, когда отношения хранятся в наборе объектов - индексация вообще не имеет смысла.
- Я мог бы экспортировать репозиторий (exported=true) объекта B для манипулирования им «напрямую», но таким образом я потерял бы возможность хранить весь объект A с его B объекты в одном запросе POST, как я упоминал ранее.
Я хотел бы избежать отправки всего объекта A с одной крошечной модификацией его объекта B для PUT, если это возможно. Спасибо.