كيف يمكنني الوصول إلى الحقول المحملة كسول بعد إغلاق الجلسة ، باستخدام السبات؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

النظر في هذا السيناريو:

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

ما هي الطرق / أفضل طريقة لتحميل هذه المجموعة؟

  • افترض أن Session in-View ليس خيارًا لأن جلب مجموعة الأطفال لن يحدث إلا بعد أن شاهد المستخدم الوالد وقرر عرض الأطفال.
  • هذه خدمة سيتم الوصول إليها عن بُعد بواسطة عميل ويب وسطح المكتب.

شكرًا.

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

المحلول

أقوم ببعض الافتراضات حول ما ينظر إليه المستخدم ، لكن يبدو أنك تريد فقط استرداد الأطفال إذا كان المستخدم قد شاهد الوالد بالفعل ويريد حقًا رؤية الأطفال.

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

criteria = session.createCriteria(Child.class);
criteria.add(Restrictions.eq("parent", parent));
List<Child> children = criteria.list();

نصائح أخرى

يمكن تحميل المجموعة البطيئة باستخدام hibernate.initialize (parent.getCollection ()) باستثناء أن الكائن الأصل يحتاج إلى إرفاق جلسة نشطة.

يأخذ هذا الحل الكيان الأصل واسم الحقل المحمّل كسول ويعيد الكيان باستخدام المجموعة المحملة بالكامل.

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

لذلك في سيناريو OP ، يمكن إجراء هذه المكالمة عندما يختار المستخدم عرض المجموعة البطيئة:

Parent parentWithChildren = dao.initialize(parent,"lazyCollectionName");

طريقة:

public Entity initialize(Entity detachedParent,String fieldName) {
    // ...open a hibernate session...
    // reattaches parent to session
    Entity reattachedParent = (Entity) session.merge(detachedParent); 

    // get the field from the entity and initialize it
    Field fieldToInitialize = detachedParent.getClass().getDeclaredField(fieldName);
    fieldToInitialize.setAccessible(true);
    Object objectToInitialize = fieldToInitialize.get(reattachedParent);

    Hibernate.initialize(objectToInitialize);
    return reattachedParent;
}

يعالج السبات مجموعات بطريقة مختلفة في الحقول الطبيعية.

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

public Parent loadParentWithIntent1(Long parentId)
{
  Parent parent = loadParentFromDAO();

  for (Child c : parent.getChildren())
  {
    c.getField1();
  }
}

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

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