REST API: قطع العلاقة إذا تمت إزالتها من JSON؟

0

أنا أقوم بإنشاء API باستخدام Spring Data JPA / hibernate / Spring Boot. لنفترض أن لدي هذا 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. هل يجب أن أسمح بتشغيل PUT فقط على المورد التابع ، لإجبار المستخدم على تحديث العلاقة من جانب الطفل؟

  3. إذا كان الحل (1) على ما يرام ، فكيف يمكنك إجراء هذا التحديث باستخدام Spring Data JPA؟ عندما أقوم بتحديث الكيان بطفل مفقود ، يتجاهله ببساطة!

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

1 إجابة

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

PS إنه مجرد نموذج تخطيطي - في مشروع حقيقي يجب عليك حفظ الكيانات في طبقة الخدمة.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام