如何使用Spring Data REST添加OneToMany关系中的对象REST
问题描述:
当无法导出映射的类REST存储库时,我无法弄清楚如何使用Spring-Data REST将对象添加到OneToMany关系中。如何使用Spring Data REST添加OneToMany关系中的对象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是类似的,但不同的是,在这种情况下,存储库不导出,而在这个问题上。
答
如果您使用PUT
您should be sendingtext/uri-list
媒体类型。但我不明白你会怎么做,因为你没有出口Answer
存储库,因此你不能先打电话给POST
。
你试过PATCH
?虽然没有记录,但...
我通过编写自定义控制器来处理POST到http:// localhost:9090/data/questions/7/answers来解决此问题,但我不认为这是回答这个SO问题。 – JBCP 2014-10-10 14:15:01
它不应该有必要实现自己的控制器。你的命令不会添加一个答案,顺便说一句。 – zeroflagL 2014-10-13 14:51:34
我同意不应该有必要,但我没有其他解决方案。你的意思是我的评论没有添加答案?那是因为我不认为它是这个问题的答案。 – JBCP 2014-10-13 20:16:47