Hibernate RESTAPI:如果从JSON中删除,会破坏关系吗?

Hibernate RESTAPI:如果从JSON中删除,会破坏关系吗?,hibernate,rest,api,spring-data-jpa,spring-rest,Hibernate,Rest,Api,Spring Data Jpa,Spring Rest,我正在使用Spring数据JPA/hibernate/Spring Boot构建一个API。 假设我有一个JSON请求:GET/Parents/1 { "id": 1, "name": "Dad", "adoptedChildren": [ { "id": 1, "name": "Marie", "age": 10 }, { "id": 1, "name": "Robert",

我正在使用Spring数据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缺少一个子元素

我有两个问题:

  • 这是允许断开父子关系的正确方式吗孩子不能被删除,我需要的只是打破两者之间的关系

  • 我是否应该只允许对子资源执行PUT操作,以强制用户从子资源端更新关系

  • 如果解决方案(1)正常,您如何使用Spring数据JPA进行此更新?当我用丢失的子对象更新实体时,它会忽略它

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

  • 在我看来,这一切都取决于你的模型

    1) 如果您的“子对象”是依赖实体,并且没有自己的存储库,那么您的选择是#1。但是在这种情况下,当您将保存一个包含嵌套子实体的父实体时,您应该更正父类,使其正常工作:

    @Entity
    public class Parent {
        //...
        @OneToMany(cascade = ALL, orphanRemoval = true)
        private List<Child> children;
        //...
    } 
    
    另外,这只是一个示意图模型——在实际项目中,您应该将实体保存在服务层中

    @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())
    }