【问题标题】:How to add an object in a OneToMany relationship using Spring Data REST如何使用 Spring Data REST 在 OneToMany 关系中添加对象
【发布时间】:2014-12-05 00:26:35
【问题描述】:

当未导出映射类 REST 存储库时,我无法弄清楚如何使用 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=\"all-delete-orphan\" 的集合不再是 由拥有实体实例引用:com.example.Question.answers

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

This question 类似,但不同之处在于在这种情况下不会导出存储库,而在该问题中是导出的。

【问题讨论】:

  • 我通过编写自定义控制器来处理发送到localhost:9090/data/questions/7/answers 的 POST 解决了这个问题,但我不认为这是这个 SO 问题的答案。
  • 没有必要实现自己的控制器。顺便说一句,您的命令没有添加答案。
  • 我同意这不应该是必要的,但我没有其他解决方案。你的意思是我的评论没有添加答案吗?那是因为我不认为它是问题的答案。
  • 您的命令 (= curl ...),而不是评论,不会将 Answer 添加到 Question。如果有的话,它会取代所有答案。发帖到localhost:9090/data/questions/7/answers 应该开箱即用 - 你试过了吗?
  • @zeroflagL - 你是对的,我上面显示的curl 命令旨在设置所有答案,我希望这是一个有效的操作,但它不起作用。是的,我尝试发布到...questions/7/answers,这就是引发这个问题的原因。当您的存储库中有 @RestResource(exported = false) 时,它会禁用对该 URL 的访问,并且您会收到 HTTP 405 错误。

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


【解决方案1】:

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

你试过PATCH吗?虽然没有这样记录......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-18
    • 2016-01-09
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 2021-02-10
    • 1970-01-01
    相关资源
    最近更新 更多