REST API:如果从JSON中删除,则会中断关系?

时间:2018-07-30 10:07:18

标签: hibernate rest api spring-data-jpa spring-rest

我正在使用Spring Data JPA / hibernate / Spring Boot构建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);
    }
    

1 个答案:

答案 0 :(得分:0)

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

1)如果“孩子”是从属实体,并且没有自己的存储库,则您的选择是#1。但是在这种情况下,当您保存带有嵌套子级的父实体时,您应该更正Parent类以使其正常工作。

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

2)如果您的“子代”是独立的对象,并且它们都有自己的存储库,那么您应该选择第二个选项-只需从子实体中删除对前一个父代的引用(将其设置为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())
}

P.S。这只是原理图模型-在实际项目中,您应该将实体保存在服务层中。