لماذا لا تحذف JPA الكيانات المملوكة عندما يفقد كيان المالك المرجع إليهم؟

StackOverflow https://stackoverflow.com/questions/1133179

  •  16-09-2019
  •  | 
  •  

سؤال

لدي طلب كيان JPA "طلب"، الذي يمتلك قائمة بالإجابات (أيضا كيانات JPA). إليك كيفية تعريفها بالطلب. Java:

@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;

وفي الإجابة. جافا:

@JoinColumn(name = "request", referencedColumnName="id")
@ManyToOne(optional = false)
private Request request;

في سياق تنفيذ البرنامج، قد تكون قائمة الإجابات في الطلب قد تتم إضافة إجابات أو إزالتها منه، أو قد يتم استبدال كائن القائمة الفعلية. مشكلتي هي بالتالي: عند دمج طلب إلى قاعدة البيانات، وكائنات الإجابة التي تستخدم في القائمة يتم الاحتفاظ بها في القائمة في قاعدة البيانات - أي الإجابة الكائنات التي لم تعد الطلب لم تعد مرجعا إلى (بشكل غير مباشر، عبر قائمة) غير محذوفة.

هذا ليس هو السلوك الذي أرغب فيه، كما لو قمت بدمج طلبا إلى قاعدة البيانات، ثم جلبه مرة أخرى، قد لا تكون قائمة الإجابات هي نفسها. هل سأقدم بعض خطأ البرمجة؟ هل هناك شرح أو إعداد سيضمن أن الإجابات في قاعدة البيانات هي بالضبط الإجابات في قائمة الطلب؟

الحل هو الحفاظ على الإشارات إلى قائمة الإجابات الأصلية ثم استخدم EntityManager لإزالة كل إجابة قديمة قبل دمج الطلب، ولكن يبدو أنه يجب أن يكون هناك طريقة نظافة.

هل كانت مفيدة؟

المحلول

في JPA 1.0، ما تريد القيام به لا يمكن القيام به بواسطة JPA. ببساطة، يجب أن يتم تطبيق جميع إدارة العلاقات من قبل التطبيق، بما في ذلك إزالة أي أيتام من المجموعات (وهو ما تحاول القيام به).

في JPA 2.0، يفعلون الدعم (على الرغم من أنني لا أعرف التفاصيل)، ولكن اعتمادا على تنفيذك، قد لا تكون الترقية سهلة أو ممكنة.

يمكنك أيضا استخدام شيء مثل السبات مباشرة، ولكن لا يزال يستخدم العديد من التعليقات التوضيحية JPA 1.0، وما إلى ذلك. لا يمكنني تقديم تفاصيل عن ذلك أيضا.

في حالتي، كتبت رمز عام للتعامل مع دمج المجموعات تلقائيا عبر الانعكاس.

نصائح أخرى

باستخدام Eclipselink ووضع التعليقات التوضيحية @ LivateAned إلى قائمة الإجابة، ستساعد.

من غير القانوني تحديد خصائص إضافية في العلاقة المعينة. يمكنك استخدام التعليق التوضيحي @ الطلب بدلا من ذلك.

إذا كنت تستخدم السبات كوفر JPA، فيمكنك إضافة

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

في قائمة الإجابة. هذا سيعمل بالإضافة إلى التعليقات التوضيحية JPA التي تستخدمها هناك بالفعل. jpa 2 (معظم / جميع مقدمي JPA ليس لديهم تنفيذ جاهز للإنتاج في هذا الوقت) يمكن أن تفعل ذلك بمفردها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top