【发布时间】:2014-12-05 00:26:35
【问题描述】:
当未导出映射类 REST 存储库时,我无法弄清楚如何使用 Spring-Data REST 将对象添加到 OneToMany 关系。
我有两个班级,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
不幸的是,此时我收到以下错误:
具有 cascade=\"all-delete-orphan\" 的集合不再是 由拥有实体实例引用:com.example.Question.answers
对 StackOverflow 的简短搜索表明上述错误是由于将您的集合替换为另一个集合,从而孤立了以前的集合。由于所有这些代码都由 Spring 管理,我不知道如何操作我的对象来避免这个问题。
This question 类似,但不同之处在于在这种情况下不会导出存储库,而在该问题中是导出的。
【问题讨论】:
-
我通过编写自定义控制器来处理发送到localhost:9090/data/questions/7/answers 的 POST 解决了这个问题,但我不认为这是这个 SO 问题的答案。
-
没有必要实现自己的控制器。顺便说一句,您的命令没有添加答案。
-
我同意这不应该是必要的,但我没有其他解决方案。你的意思是我的评论没有添加答案吗?那是因为我不认为它是问题的答案。
-
您的命令 (=
curl ...),而不是评论,不会将Answer添加到Question。如果有的话,它会取代所有答案。发帖到localhost:9090/data/questions/7/answers应该开箱即用 - 你试过了吗? -
@zeroflagL - 你是对的,我上面显示的
curl命令旨在设置所有答案,我希望这是一个有效的操作,但它不起作用。是的,我尝试发布到...questions/7/answers,这就是引发这个问题的原因。当您的存储库中有@RestResource(exported = false)时,它会禁用对该 URL 的访问,并且您会收到 HTTP 405 错误。
标签: java spring spring-data spring-data-rest