Spring Data REST多对多关联失效、表现为一对多的问题排查
问题1:添加第二个subscription覆盖原有绑定关系
- 根因:你当前使用
PUT请求操作关联集合,PUT的语义是全量替换集合内容,而非追加新元素。 - 解决方法:需要追加关联时改用
POST请求即可,示例curl命令:
curl -i -X POST -H "Content-Type:text/uri-list" --data-binary "http://localhost:8080/subscriptions/2" http://localhost:8080/phases/1/subscriptions
执行后phase1会同时关联subscription1和subscription2,不会覆盖原有绑定。
问题2:subscription表的phase字段始终为NULL
- 根因:你当前配置的是多对多关联,关联关系完全由
@JoinTable指定的中间表phases_subscriptions维护,你在subscription.sql中额外添加的phase字段没有被JPA实体映射,JPA不会自动维护该字段的值。 - 解决方法:多对多场景不需要在从表中单独存储关联主表id,直接删除subscription表中多余的
phase字段和对应的外键约束即可,现有中间表已经可以满足关联查询需求。
问题3:通过Postman发PATCH请求绑定多对多关联
按以下步骤操作即可实现:
- 确保实体类的关联属性没有被配置为
@RestResource(exported = false),你当前的配置默认支持关联属性导出 - 打开Postman新建请求,请求方式选
PATCH,请求地址填http://localhost:8080/subscriptions/1(对应你要操作的subscription资源地址) - 请求头添加
Content-Type: application/json - 请求体填写JSON内容,注意多对多关联是集合类型,要传数组格式:
{ "phases": ["http://localhost:8080/phases/1"] }
如果需要同时绑定多个phase,直接在数组中添加对应资源URI即可:
{ "phases": ["http://localhost:8080/phases/1", "http://localhost:8080/phases/2"] }
- 可选补充:如果请求执行时报关联实体未持久化的错误,可以在Phase实体的
@ManyToMany注解上添加级联配置:
@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) @JoinTable(name = "phases_subscriptions", joinColumns = @JoinColumn(name = "phase_id"), inverseJoinColumns = @JoinColumn(name = "subscription_id")) @Getter @Setter private List<Subscription> subscriptions;
内容的提问来源于stack exchange,提问作者Raissa Correia
相关产品推荐
相关产品推荐

