Hibernate - تطبيق الأقفال على الجداول الأصلية في استعلامات الأشكال المتعددة

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

سؤال

لدي كائنان:

public class ParentObject {
 // some basic bean info
}

public class ChildObject extends ParentObject {
 // more bean info
}

كل من هذه الجداول يتوافق مع جدول مختلف في قاعدة بيانات. أنا أستخدم Hibernate للاستعلام عن ChildObject ، والتي بدورها ستعمل على ملء قيم الكائنات الأصل.

لقد حددت ملف التعيين الخاص بي على النحو التالي:

<hibernate-mapping>
<class name="ParentObject"
       table="PARENT_OBJECT">
   <id name="id"
       column="parent"id">
      <generator class="assigned"/>
   </id>
   <property name="beaninfo"/>
   <!-- more properties -->
   <joined-subclass name="ChildObject" table="CHILD_OBJECT">
       <key column="CHILD_ID"/>
       <!--properties again-->
   </joined-subclass>
</class>
</hibernate-mapping>

يمكنني استخدام السبات للاستعلام عن الجدولين دون مشكلة.

أنا أستعمل

session.createQuery("from ChildObject as child ");

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

يمكنني ضبط نوع القفل للكائن الفرعي باستخدام Query.SetLockType ("الطفل" ، lockmode.؟). ومع ذلك ، لا يمكنني إيجاد طريقة لوضع قفل على الطاولة الأصل.

أنا جديد على السبات ، وما زلت أعمل حول عدد قليل من حواجز الطرق الذهنية. والسؤال هو: كيف يمكنني وضع قفل على الجدول الأصل؟

كنت أتساءل عما إذا كان هناك طريقة للتغلب على القيام بذلك دون التراجع عن بنية الأشكال التي قمت بإعدادها.

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

المحلول

لماذا يجب عليك قفل كلا الطاولتين؟ أنا أسأل لأنه بناءً على ما تحاول القيام به ، قد يكون هناك حلول بديلة لتحقيق ما تريد.

الطريقة التي تكون بها الأمور ، السبات بشكل طبيعي فقط يغلق جدول الجذر ما لم تكن تستخدم بعض قاعدة البيانات / اللهجة الغريبة. لذا ، من المحتمل أنك تقفلك بالفعل ParentObject الجدول بدلا من ChildObject.

تحديث (بناءً على التعليق):

نظرًا لأنك تستخدم قاعدة بيانات غريبة :-) والتي لا تدعم FOR UPDATE بناء الجملة ، تقوم السبات بإغلاق الجداول "الأساسية" كما هو محدد في الاستعلام ("الأساسي" في هذه الحالة الجدول المعين للكيان المدرج في FROM بند ، وليس جذر التسلسل الهرمي - على سبيل المثال ChildObject, ، ليس ParentObject). نظرًا لأنك تريد قفل كلا الجدولين ، أقترح عليك تجربة أحد ما يلي:

  1. يتصل session.lock() على الكيانات بعد الحصول عليها من الاستعلام. هذا يجب أن يغلق جذر جدول التسلسل الهرمي ، ومع ذلك لست متأكدًا بنسبة 100 ٪ من ما إذا كان سيعمل لأنك تحاول "ترقية" القفل الذي يتم الاحتفاظ به بالفعل على كيان معين.
  2. حاول الغش بالتسمية بشكل صريح ParentObject جدول في استعلامك وطلب وضع القفل لذلك:

    String hql = "select c from ChildObject c, ParentObject p where c.id = p.id";
    session.createQuery(hql)
     .setLockMode("c", LockMode.READ)
     .setLockMode("p", LockMode.READ).list();
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top