REST API:如果从JSON中移除,则破坏关系



我正在使用SpringDataJPA/hibernate/SpringBoot构建一个API。假设我有这个JSON和这个请求:GET/Parents/1

{
"id": 1,
"name": "Dad",
"adoptedChildren": [
{
"id": 1,
"name": "Marie",
"age": 10
},
{
"id": 1,
"name": "Robert",
"age": 9
}
]
}

这只是一个有两个领养孩子的父母。现在,无论出于什么原因,这位家长失去了一个孩子,所以我收到了这个PUT请求:PUT/Parents/1

{
"id": 1,
"name": "Dad",
"adoptedChildren": [
{
"id": 1,
"name": "Robert",
"age": 9
}
]
}

JSON缺少一个子项。

我有两个问题:

  1. 这是允许断开父子关系的正确方法吗孩子不会被删除,我只需要打破两者之间的关系?

  2. 我应该只允许对Child资源执行PUT操作,以强制用户从Child端更新关系吗?

  3. 如果解决方案(1(是可以的,那么如何使用Spring Data JPA进行更新?当我用丢失的子项更新实体时,它只是忽略它!

    @PutMapping("parents/{id}")
    public ItineraryDTO updateItinerary(@PathVariable int id, 
    @RequestBody Parent parent){
    return parentRepository.save(parent);
    }
    

IMO这一切都取决于您的型号。

1( 如果你的"孩子"是依赖实体,没有自己的存储库,那么你的选择是#1。但在这种情况下,当您保存带有嵌套子实体的父实体时,您应该更正Parent类,使其正常工作:

@Entity
public class Parent {
//...
@OneToMany(cascade = ALL, orphanRemoval = true)
private List<Child> children;
//...
} 

2( 如果您的"子对象"是独立的对象,并且它们有自己的repo,那么您应该选择第二个选项-只需在更新时从子实体中删除对上一个父对象的引用(将其设置为null(:

@Entity
public class Parent {
//...
@OneToMany(mappedBy = "parent")
private List<Child> children;
//...
} 
@Entity
public class Child {
//...
@ManyToOne
private Parent parent;
//...
public Child removeParent() {
parent = null;
return this;
}
} 
@PutMapping("/childrent/{childId}/remove_parent")
public ResponseEntity removeParent(@PathVariable("childId") Long childId) {
return childRepo.findById(childId)
.map(c -> ResponseEntity.ok(childRepo.save(c.removeParent())))
.orElse(ResponseEntity.notFound().build())
}

附言:这只是一个示意图模型——在实际项目中,您应该将实体保存在服务层中。

相关内容

  • 没有找到相关文章

最新更新