gpt4 book ai didi

spring - 如何从反面通过 REST 更新双向@ManyToOne/@OneToMany 关系

转载 作者:行者123 更新时间:2023-12-04 16:38:37 24 4
gpt4 key购买 nike

我在 Spring Data Rest 应用程序中有 2 个实体:

@Entity
public class Question {
...
@OneToMany(mappedBy = "question")
private Set<Answer> answers = new HashSet<>();
...
}

@Entity
public class Answer {
...
@ManyToOne
Question question;
...
}

和两个实体的 Spring Data 存储库:

@RepositoryRestResource
public interface QuestionRepository extends PagingAndSortingRepository<Question, Long> {
}

@RepositoryRestResource
public interface AnswerRepository extends PagingAndSortingRepository<Answer, Long> {

}

假设我有 ID 为 1 的问题和 ID 为 1 和 2 的两个答案。然后我可以像这样链接它们:

curl -v -X PUT -H "Content-Type: text/uri-list" -d "http://localhost:8080/questions/1" http://localhost:8080/answers/1/question
curl -v -X PUT -H "Content-Type: text/uri-list" -d "http://localhost:8080/questions/1" http://localhost:8080/answers/2/question

但不是这样的:

curl -v -X PUT -H "Content-Type:text/uri-list" -d $'http://localhost:8080/answers/1\nhttp://localhost:8080/answers/2' http://localhost:8080/questions/1/answers

Spring Data Rest 通过获取 ID 为 1 的问题实例、将两个答案添加到其集合并在问题上调用休眠合并来处理最后一个 curl 请求。

问题是更改被忽略了,因为它们是从反面(不是关系的所有者)进行的。据我所知,在休眠状态下,您不能在一对多/多对一关系中更改所有者或使其可从双方更新。

这是否意味着我必须逐一更新答案集?是否可以配置 Spring Data Rest,以便它会更新所有者端的关系,以便它被休眠持久化?

最佳答案

我是 Spring Data Rest 的新手。Spring Data Rest 不这样做的原因(我认为)如下:

一个对象的 PUT 请求意味着它应该被更新以包含你给它的东西(例如问题的两个答案)。但是,如果您稍后决定将两个不同的 Answer 对象放入 uri 列表中,那么前两个 Answer 对象应该指向哪里?他们应该设置为 Null 吗?如果您的模型对 Answer 实体中的问题字段说 @NotNull 怎么办?

总之,更新答案以指向不同的问题定义明确,但更新问题的答案列表定义不明确,因此 Spring Data Rest 避免了这种情况。这当然是估计的猜测,我还没有查看 Spring Data Rest 背后的代码

关于spring - 如何从反面通过 REST 更新双向@ManyToOne/@OneToMany 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29395888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com