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

4

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

我有两个类,QuestionAnswerQuestion定义了一个成员变量,如下所示:

@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管理,我不知道如何操纵我的对象来避免这个问题。

这个问题类似,不同之处在于,在这种情况下,仓库没有被导出,而在那个问题中则导出了。


我通过编写自定义控制器来处理对 http://localhost:9090/data/questions/7/answers 的 POST 请求解决了这个问题,但我不认为这是对这个 SO 问题的答案。 - JBCP
不必要实现自己的控制器。顺便说一下,你的命令没有添加答案。 - a better oliver
我同意这不应该是必要的,但我没有其他解决方案。你是指我的评论没有提供答案吗?那是因为我不认为它是对问题的回答。 - JBCP
你的命令(=curl ...)并不是注释,它不会添加一个QuestionAnswer。如果有任何东西,它会替换所有的答案。向localhost:9090/data/questions/7/answers发布应该可以直接使用 - 你试过了吗? - a better oliver
@zeroflagL - 你说得对,我上面展示的curl命令旨在设置所有答案,我希望这是一个有效的操作,但它不起作用。是的,我尝试过向...questions/7/answers POST,这就引发了这个问题。当你在你的存储库上使用@RestResource(exported = false)时,它会禁用对该URL的访问,你会收到HTTP 405错误。 - JBCP
我没有尝试过'rel',但我怀疑它不会有所帮助,根据文档,它只是将'answers'修改为您想要的任何字符串。我真正想要的是在获取问题时提供答案对象,然后能够以某种方式更新它们。REST方式('questions / 7 / answers')也可以,但我会接受任何东西。 - JBCP
1个回答

0

如果您正在使用PUT,您应该发送text/uri-list媒体类型。但我不知道您如何做到这一点,因为您没有导出Answer存储库,因此无法首先调用POST

您尝试过PATCH吗?虽然文档中没有这样写...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接