如何使用Spring Data REST在一对多关系中添加对象。

13 浏览
0 Comments

如何使用Spring Data REST在一对多关系中添加对象。

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

我有两个类,Question和Answer。Question有一个成员变量定义如下:

@OneToMany(mappedBy = "answer", cascade=CascadeType.ALL, orphanRemoval = true)

@LazyCollection(LazyCollectionOption.FALSE)

private List answers = new LinkedList();

而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 {}

当我在这里获取一个问题: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管理,我不知道如何操作我的对象以避免这个问题。

这个问题类似于这个问题,然而不同之处在于在这种情况下存储库未导出,在那个问题中是导出的。

0
0 Comments

问题的原因是:使用PUT方法时,应该使用text/uri-list媒体类型发送请求,但是由于Answer仓库没有被导出,无法先调用POST方法。是否尝试过PATCH方法,尽管文档中没有这样说明。

解决方法是:尝试使用PATCH方法。

0