Spring Data REST 多对多失败:一对多工作
Posted
技术标签:
【中文标题】Spring Data REST 多对多失败:一对多工作【英文标题】:Spring Data REST Many to Many failing: working as One to Many 【发布时间】:2021-10-26 23:59:11 【问题描述】:我有两个使用 Spring Data REST 的实体: 在多对多关系中“阶段”父和“订阅”子。 我用这篇文章作为参考:https://www.baeldung.com/spring-data-rest-relationships
阶段实体:
@ManyToMany
@JoinTable(name = "phases_subscriptions",
joinColumns = @JoinColumn(name = "phase_id"),
inverseJoinColumns = @JoinColumn(name = "subscription_id"))
@Getter @Setter
private List<Subscription> subscriptions;
订阅实体:
@ManyToMany(mappedBy = "subscriptions")
@Getter @Setter
private List<Phase> phases;
订阅.sql
phase int,
CONSTRAINT fk_subscription_phase FOREIGN KEY subscriptionPhase (phase)
REFERENCES phase (id) ON DELETE CASCADE ON UPDATE CASCADE
有了这些,我得到了以下结果:
GET http://localhost:8080/subscriptions/ 创建订阅 GET http://localhost:8080/phases/ 创建阶段 在终端上(不是在邮递员上) curl -i -X PUT -H "Content-Type:text/uri-list" --data-binary "http://localhost:8080/subscriptions/1" http:// /localhost:8080/phases/1/subscriptions 订阅 1 现在与阶段 1 建立关系 GET http://localhost:8080/phases/1/subscriptions 我得到订阅 1 GET http://localhost:8080/subscriptions/1/phases 我得到了第一阶段现在的问题:
如果我尝试将第二个订阅添加到阶段,我只是覆盖,现在只有订阅 2 具有关系 只有表(由 spring 创建)phases_subscriptions 有两个 id,在订阅表中它在阶段列中仍然是 NULL 我还想使用邮递员来创建这些新关系,例如我可以在一对多中使用:PATCH "phases": "phase 1 URL" at Subscription 1 URL【问题讨论】:
"只有表(由 spring 创建)phases_subscriptions 有两个 id,在订阅表中它在阶段列中仍然是 NULL"。 . .这是预期的,表“phases_subscriptions”是负责连接两个实体的表,这是多对多关系中的预期行为。 是的,我知道,但我不能在每个阶段添加多个订阅,它会覆盖,这就是问题 我建议:验证您是否正确更新了域模型中的双向引用,具体取决于您设置值的哪一侧。您在问题中描述的内容听起来就像一侧的更改不会传播到另一侧。或者(和我的实际建议):首先避免双向关系,因为它们很容易实现错误,导致这些微妙的问题。如果您有时间,请随时创建一个复制器项目并在github.com/spring-projects/spring-data-rest/issues 提交问题 【参考方案1】:我只解决了将 HTTP 动词从 PUT 更改为 PATCH 的问题,如下所示: curl -i -X PATCH -H "Content-Type:text/uri-list" --data-binary "http://localhost:8080/subscriptions/2" http://localhost:8080/phases/1/subscriptions
【讨论】:
以上是关于Spring Data REST 多对多失败:一对多工作的主要内容,如果未能解决你的问题,请参考以下文章