سؤال

أواجه مشكلة في حذف اليتيم العقد باستخدام JPA مع التعيين التالية

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;

أنا أواجه مشكلة اليتامى الأدوار التسكع في قاعدة البيانات الخاصة بنا.

يمكنني استخدام هذا الشرح org.hibernate.annotations.Cascade السبات محددة الوسم ولكن من الواضح أنني لا أريد أن التعادل الحل في السبات التنفيذ.

تحرير:يبدو JPA 2.0 سوف تشمل دعم هذا.

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

المحلول

إذا كنت تستخدم مع السبات ، عليك أن تحدد بوضوح الشرح CascadeType.DELETE_ORPHAN, التي يمكن استخدامها جنبا إلى جنب مع JPA CascadeType.ALL.

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

تسلسل التنفيذ

  1. الجلب الرئيسية الصف المراد حذفه
  2. جلب عناصر الطفل
  3. حذف جميع عناصر الطفل
  4. حذف الرئيسية الصف
  5. إغلاق جلسة

مع JPA 2.0, يمكنك الآن استخدام الخيار orphanRemoval = true

@OneToMany(mappedBy="foo", orphanRemoval=true)

نصائح أخرى

إذا كنت تستخدم JPA 2.0، يمكنك الآن استخدام السمة orphanRemoval=true من الشرح @xxxToMany لإزالة الأيتام.

في الواقع، لقد تم إهمال CascadeType.DELETE_ORPHAN في 3.5.2-النهائي.

╔═════════════╦═════════════════════╦═════════════════════╗
║   Action    ║  orphanRemoval=true ║   CascadeType.ALL   ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   delete    ║     deletes parent  ║    deletes parent   ║
║   parent    ║     and orphans     ║    and orphans      ║
╠═════════════╬═════════════════════╬═════════════════════╣
║   change    ║                     ║                     ║
║  children   ║   deletes orphans   ║      nothing        ║
║    list     ║                     ║                     ║
╚═════════════╩═════════════════════╩═════════════════════╝

إذا كنت تستخدم JPA مع EclipseLink, سيكون لديك لتعيين @PrivateOwned الشرح.

الوثائق: الكسوف ويكي باستخدام EclipseLink JPA امتداد الفصل 1.4 كيفية استخدام @PrivateOwned الشرح

ويمكنك استخدامPrivateOwned حذف الأيتام منها مثلا

@OneToMany(mappedBy = "masterData", cascade = {
        CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;

ووفقا ل جافا مع استمرار السبات ، <م> سلسلة اليتيم حذف غير متوفر كما الشرح النقابة.

وأيضا غير معتمدة وفي نقابة الصحفيين XML.

أنا فقط وجدت هذا الحل لكن في حالتي لا يعمل:

@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 

orphanRemoval = true ليس له أي تأثير.

وكان لي نفس المشكلة وكنت أتساءل لماذا هذا الشرط لم أقل تقم بحذف الأيتام. لم يتم حذف قائمة من الأطباق في السبات (5.0.3.Final) عندما أعدم استعلام حذف اسمه:

@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();

وثم تذكرت أنني على يجب عدم استخدام استعلام حذف اسمه ، لكن في EntityManager. كما اعتدت طريقة EntityManager.find(...) لجلب الكيان ومن ثم EntityManager.remove(...) لحذفه، وحذف أطباق كذلك.

وفقط @OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true).

وإزالة على targetEntity = MyClass.class ، أو يعمل كبيرة.

لسجلات، في OpenJPA قبل JPA2 كانElementDependant.

وكنت تستخدم واحد لرسم الخرائط واحد، ولكن الطفل لم يكن الحصول على حذف JPA كان يعطي انتهاك مفتاح خارجي

وبعد استخدام orphanRemoval = الحقيقية، قضية تم حلها

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