当映射类的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>();
答案与问题之间的映射关系如下:
@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
很不幸,此时我遇到了以下错误:
一个级联关系为“all-delete-orphan”的集合不再被拥有的实体实例引用:com.example.Question.answers
StackOverflow上的简要搜索表明上述错误是由于将集合替换为另一个集合而造成的,使之前的集合变为孤立状态。由于所有这些代码都由Spring管理,我不知道如何操纵我的对象来避免这个问题。
这个问题类似,不同之处在于,在这种情况下,仓库没有被导出,而在那个问题中则导出了。
curl ...
)并不是注释,它不会添加一个Question
的Answer
。如果有任何东西,它会替换所有的答案。向localhost:9090/data/questions/7/answers
发布应该可以直接使用 - 你试过了吗? - a better olivercurl
命令旨在设置所有答案,我希望这是一个有效的操作,但它不起作用。是的,我尝试过向...questions/7/answers
POST,这就引发了这个问题。当你在你的存储库上使用@RestResource(exported = false)
时,它会禁用对该URL的访问,你会收到HTTP 405错误。 - JBCP