كيف يمكنني استخدام JPQL لحذف إدخالات من الانضمام الطاولة؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

ولدي الكائن النقابة التي لديها علاقة عديدة لكثير من هذا القبيل:

@Entity
public class Role {
    //...

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(
    name="RolePrivilege",
    joinColumns=
        @JoinColumn(name="role", referencedColumnName="ID"),
    inverseJoinColumns=
        @JoinColumn(name="privilege", referencedColumnName="ID")
    )
    private Set<Privilege> privs;
}

وليس هناك كائن JPA لRolePrivilege، لذلك أنا غير متأكد من كيفية كتابة استعلام JPQL لحذف إدخالات من حقل privs لكائن الدور. على سبيل المثال، لقد حاولت ذلك، ولكنه لا يعمل. ومن يشكو من أن Role.privs أنه لم يتم تعيين.

DELETE FROM Role.privs p WHERE p.id=:privId

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

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

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

المحلول

والتحديث JPQL وحذف البيانات تحتاج إلى الرجوع إلى اسم الكيان، وليس اسم الجدول، لذلك أعتقد أنك من الحظ مع اقتراب قمت المقترحة.

واعتمادا على مزود النقابة الخاصة بك، هل يمكن حذف الإدخالات من JoinTable باستخدام عبارة SQL الخام بسيط (يجب أن يكون 100٪ المحمولة) ومن ثم التفاعل برمجيا مع API مزود ذاكرة التخزين المؤقت لطرد البيانات. على سبيل المثال في حالة السبات يمكنك الاتصال نزع () لتنتهي جميع "Role.privs" مجموعات من ذاكرة التخزين المؤقت 2nd المستوى:

sessionFactory.evictCollection("Role.privs", roleId); //evict a particular collection of privs
sessionFactory.evictCollection("Role.privs"); //evict all privs collections

للأسف أنا لا أعمل مع واجهات برمجة التطبيقات JPA يكفي أن نعرف على وجه اليقين ما يتم اعتماد بالضبط.

نصائح أخرى

وأنا أيضا كان يبحث عن نهج JPQL إلى حذف كثير لكثير علاقة (الواردة في جدول الانضمام). من الواضح، وليس هناك مفهوم الجداول في ORM، لذلك نحن لا يمكن استخدام عمليات حذف ... ولكن أود أن هناك مشغل خاص لهذه الحالات. شيء من هذا القبيل لينك وUNLINK. ربما ميزة في المستقبل؟

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

وعلى سبيل المثال، إذا كنت حصلت على الطالب الدرجة التي لديها علاقة، العديد من لمع العديد من المحاضرات:

@ManyToMany
private Collection <Courses> collCourses;

وأبني في الكيان جالبة واضعة لذلك جمع. ثم، على سبيل المثال من EJB، I استرداد جمع باستخدام جالبة، إضافة أو إزالة دورة المرجوة، وأخيرا، استخدام واضع لتعيين مجموعة جديدة. وانها فعلت. وهو يعمل تماما.

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

ولأن بالنسبة لي انها غير فعالة بقدر استرجاع السجلات من جدول وبعد تصفية لهم باستخدام جافا النقي بدلا من لغة الاستعلام الذي يعمل مباشرة أو undirectly مع محرك DB الداخلي (SQL، JPQL ...).

وجافا هي لغة وجوه المنحى وبيت القصيد من ORM هي لإخفاء تفاصيل ربط الجداول ومثل من أنت. وبناء على ذلك حتى تفكر الحذف من الانضمام طاولة المفاوضات من دون النظر في العواقب ستكون غريبة.

لا لا يمكنك أن تفعل ذلك مع JPQL، وهذا هو للكيانات.

واسترداد الكيانات على حد سواء واضح من مجموعاتها. سيؤدي ذلك إلى إزالة إدخالات الانضمام الجداول. وجوه المنحى.

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