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

时间:2014-10-09 22:46:01

标签: java spring spring-data spring-data-rest

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

我有两个班级,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

不幸的是,此时我收到以下错误:

  

具有cascade = \&#34; all-delete-orphan \&#34;的集合不再是   由拥有实体实例引用:com.example.Question.answers

对StackOverflow的简要搜索表明上述错误是由于将您的集合替换为另一个集合而导致上一个错误孤立的。由于所有这些代码都是由Spring管理的,因此我不知道如何操纵我的对象来避免这个问题。

This question是类似的,但区别在于,在这种情况下,存储库不会被导出,而在那个问题中它是。

1 个答案:

答案 0 :(得分:0)

如果您正在使用PUT should be sending text/uri-list媒体类型。但是我不知道你会怎么做,因为你没有导出Answer存储库,所以你不能先调用它POST

你试过PATCH吗?尽管如此,它还没有记录......