إصدار السبات كسول: LazyinitializationException: فشل في تهيئة بتكاسل مجموعة من الدور

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

سؤال

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

org.hibernate.lazyinitializationExceptionEs: فشل في تهيئة مجموعة من الدور

هل يمكنني استخدام Lockmode أو بأي طريقة أخرى لحل هذه المشكلة؟ يمكن العثور على كائن حسب معرفه دون أي معاملة؟

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

المحلول

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

  1. لا تغمض الجلسة حتى تتم مع الصفحة. يطلق على هذا النمط "جلسة عرض" ويمكن تنفيذها على سبيل المثال مع مرشح Servlet.

  2. تهيئة جميع المحتويات التي ستحتاج إليها قبل إغلاق الجلسة. إذا كنت ترغب في تهيئة الكائن بأكمله، يمكنك استخدام Hibernate.initialize (كائن).

تحرير: لا يمكنك فعل أي شيء خارج المعاملة في السبات.

نصائح أخرى

يمكنك أيضا إلقاء نظرة على الحل الرسمي من السبات فيhttp://www.hopernate.org/43.html.

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

من بيع بيع حيث sale.date>: startdate اليسار الانضمام جلب بيع. المنتج

سيؤدي هذا مسبقا إلى جلب. كائن المنتج.

يحتوي هذا الموقع على مزيد من المعلومات: http://www.javalobby.org/articles/hopernate-query/1/01/.

-Dave.

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

  1. مجرد استدعاء الحصول على مناسب. بعد أن يتم جلب الحقل في الفاصوليا، هناك بعد جلسة مغلقة.
  2. استخدم السمة المناسبة في واصف الفاصوليا في JPA كنت تستخدم @OneToMany(fetch = FetchType.EAGER), ، ولكن هناك طرق سبات مماثلة للقيام بذلك.
  3. يمكنك تهيئة الحقل في استعلام HQL (لست متأكدا مما إذا كان يعمل في HQL، لكنني أعتقد أنه يفعل)، ابحث عنه FETCH INTO الكلمة الرئيسية.

أو مجرد استخدام orm آخر ... مثل ebean orm حيث loading loading يعمل فقط :)

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