Не могу понять, как добавить объект к отношениям OneToMany, используя REST-Data REST, когда сопоставленные классы REST Repository не экспортируются.Как добавить объект в отношения OneToMany с использованием Spring Data REST
У меня есть два класса, Question
и Answer
. Question
имеет переменную-член, определенный как это:
@OneToMany(mappedBy = "answer", cascade=CascadeType.ALL, orphanRemoval = true)
@LazyCollection(LazyCollectionOption.FALSE)
private List<Answer> answers = new LinkedList<Answer>();
И Answer
сопоставляет обратно Question
так:
@NotNull
@ManyToOne(targetEntity = Question.class)
@JoinColumn(name = "question_id", referencedColumnName = "id")
private Question question;
Потому что Answer
объекты относятся только к Question
они принадлежат, Я отключил экспортирования репозиторий REST:
@RestResource(exported = false)
public interface AnswerRepository extends JpaRepository<Answer, Long> {}
Когда я задаю вопрос здесь: http://localhost:9090/data/questions/7
, я получаю что-то вроде этого:
{
"creationDate": "2014-09-26T06:36:44.000+0000",
"modificationDate": "2014-09-26T06:36:44.000+0000",
"answers": [],
"_links": {
"self": {
"href": "http://localhost:9090/data/questions/7"
}
}
}
Пока все хорошо. Теперь я хочу, чтобы добавить ответ, как это:
curl -v -X PUT -H "Content-Type: application/json" \
-d "{"answers": [{"value": "Red"}]}" http://localhost:9090/data/questions/7
К сожалению, на данный момент я получаю следующее сообщение об ошибке:
A collection with cascade=\"all-delete-orphan\" was no longer referenced by the owning entity instance: com.example.Question.answers
Краткий поиск StackOverflow указывает выше ошибка вызвана заменой коллекции с другой, осиротевшей предыдущую коллекцию. Поскольку весь этот код управляется Spring, я не вижу, как манипулировать моими объектами, чтобы избежать этой проблемы.
This question похоже, однако разница в том, что в этом случае репозиторий не экспортируется, в то время как в этом вопросе он есть.
Я решил эту проблему, написав пользовательский контроллер для обработки POST на http: // localhost: 9090/data/questions/7/answers, но я не считаю, что ответьте на этот вопрос. – JBCP
Не нужно использовать собственный контроллер. Ваша команда не добавляет ответ, кстати. – zeroflagL
Я согласен, что это не обязательно, но у меня нет другого решения. Вы имеете в виду, что мой комментарий не добавляет ответа? Это потому, что я не считаю это ответом на вопрос. – JBCP