如何使用Spring Data REST添加OneToMany关系中的对象REST

如何使用Spring Data REST添加OneToMany关系中的对象REST

问题描述:

当无法导出映射的类REST存储库时,我无法弄清楚如何使用Spring-Data REST将对象添加到OneToMany关系中。如何使用Spring Data REST添加OneToMany关系中的对象REST

我有两个类,QuestionAnswerQuestion有这样定义一个成员变量:

@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是类似的,但不同的是,在这种情况下,存储库不导出,而在这个问题上。

+0

我通过编写自定义控制器来处理POST到http:// localhost:9090/data/questions/7/answers来解决此问题,但我不认为这是回答这个SO问题。 – JBCP 2014-10-10 14:15:01

+0

它不应该有必要实现自己的控制器。你的命令不会添加一个答案,顺便说一句。 – zeroflagL 2014-10-13 14:51:34

+0

我同意不应该有必要,但我没有其他解决方案。你的意思是我的评论没有添加答案?那是因为我不认为它是这个问题的答案。 – JBCP 2014-10-13 20:16:47

如果您使用PUTshould be sendingtext/uri-list媒体类型。但我不明白你会怎么做,因为你没有出口Answer存储库,因此你不能先打电话给POST

你试过PATCH?虽然没有记录,但...