البرمجة

تحديات تخزين كائنات متداخلة في Spring Data Rest

في مشروعي الحالي، أستخدم كائنًا من النوع “A” الذي يحتوي على علاقة OneToMany (orphanRemoval = true، cascade = CascadeType.ALL، fetch = FetchType.EAGER) مع كائنات من النوع “B”. أحتاج إلى أن يقوم Spring Data Rest (SDR) بتخزين كائن “A” بأكمله مع كائنات “B” الخاصة به (الأطفال) باستخدام طلب POST واحد. قمت بتجربة عدة تركيبات في SDR، والتي نجحت معي كانت إنشاء @RepositoryRestResource لكائن “A” وإنشاء @RepositoryRestResource أيضًا لكائن “B”، ولكن اجعل هذا الأخير (B) exported=false (إذا لم أقم بإنشاء مستودع لكائن “B” على الإطلاق، لن يعمل -> سيتم تخزين كائن “A” فقط بطلب POST واحد، ولكن ليس أطفاله (العلاقة @OneToMany) من النوع “B”؛ يحدث نفس النتيجة إذا تم ترك exported=false بدون تحديده لمستودع “B”).

هل هذا مقبول وهو الطريقة الوحيدة لتحقيق ذلك (طلب POST واحد لتخزين جميع الكائنات مرة واحدة)؟

السبب في سؤالي هو أنني في المثال السابق، يجب (أرغب في) التحكم في “دورة حياة” جميع الكائنات باستخدام مستودع “A”. أنا على استعداد لذلك، لأن علاقة “A” -> “B” هي تكوين (كائن “B” لا يوجد خارج “A”). ولكن لدي مشكلة خطيرة في تحرير (وأيضاً إزالة) كائن معين من النوع “B” باستخدام SDR باستخدام مستودع الوالد (نظرًا لأن كائن “B” لا يحتوي على مستودع خاص به مصدر). ربما، هذا ليس ممكنًا من الناحية التعريفية. لقد جربت هذه الحلول:

  • PATCH لـ “/A/1/B/2” لا يعمل -> الطريقة غير مسموحة (في الرؤوس يظهر “Allow: GET، DELETE”) -> لذلك، PUT أيضًا غير ممكن.
  • لن يعمل Json Patch أيضًا – PATCH لـ “/A/1” باستخدام نوع المحتوى json patch [{“op”: “add”، “path”: “/B/2″، ….}] -> “لا يوجد فهرس في مصفوفة الهدف” – لأن Json Patch يستخدم “2” العلم الزائد بعد “مصفوفة” كفهرس لمصفوفته. هذا ليس عمليًا في عالم Java، عندما يتم الاحتفاظ بالعلاقات في مجموعة من الكائنات – فإن الترقيم ليس له أي معنى على الإطلاق.
  • يمكنني تصدير مستودع (exported=true) لكائن “B” للتلاعب به “مباشرة”، ولكن بهذه الطريقة سأفقد القدرة على تخزين الكائن “A” بأكمله مع كائناته “B” في طلب POST واحد كما ذكرت سابقًا.

أرغب في تجنب إرسال كائن “A” بأكمله مع تعديل طفيف واحد فقط في كائن “B” الخاص به لطلب PUT، إذا كان ذلك ممكنًا. شكرًا.

المزيد من المعلومات

بالتأكيد، يمكننا استكمال فهم السياق وتسليط الضوء على بعض الجوانب الإضافية لتوضيح الوضع بشكل أفضل.

لقد واجهت تحديات في محاولتك لتكوين طلب POST واحد لتخزين كائن “A” بأكمله مع كائنات “B” المرتبطة به، وذلك باستخدام Spring Data Rest. يبدو أن الحلاقة التي وجدتها هي إنشاء مستودع لكل من الكائن “A” والكائن “B”، ولكن بتعيين “exported=false” لمستودع “B” لضمان أنه لن يتم تخزين “B” بشكل مستقل وسيعتمد تمامًا على “A”.

هذا النهج يؤدي إلى إدارة “دورة الحياة” لكل الكائنات من نوع “B” من خلال مستودع “A”. ومع ذلك، تواجه صعوبات في تعديل (وإزالة) كائن محدد من نوع “B” باستخدام SDR باستخدام مستودع “A”، بسبب عدم وجود مستودع مستقل لـ “B”.

لقد قمت بتجربة العديد من الحلول، مثل استخدام طلب PATCH لتحديث كائن “B” معين، ولكن واجهت مشاكل في السماح بهذا الطلب من قبل SDR. كما حاولت استخدام Json Patch، ولكن واجهت مشاكل مع فهم المؤشرات المستخدمة في عالم Java.

تبدو السيناريوهات الممكنة للتعامل مع هذه التحديات هي إما التضحية بإدارة “دورة الحياة” المرغوبة للكائنات من نوع “B” من خلال مستودع “A” لصالح توفير مستودع مستقل لـ “B” لإدارتها مباشرة، أو الاستمرار في استخدام النهج الحالي مع تقديم التضحيات اللازمة.

تظل هذه التحديات غير محددة بشكل كامل، وقد يكون الحل الأمثل يعتمد على الاحتياجات الدقيقة لمشروعك والتفاصيل الداخلية للنموذج البياني الخاص بك.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر