سؤال

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

public class CourseDAO {

    Session session = null;

    public CourseDAO() {
        session = HibernateUtil.getSessionFactory().getCurrentSession();
    }

    public Course findByID(int cid) {
        Course crc = null;
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Query q = session.createQuery(
                "from Course  as course where course.cid = "+cid+" "
            );
            crc = (Course) q.uniqueResult();
            //note that i am not commiting my transcation here.
            //Because If i do that i will not be able to do lazy fetch
        }
        catch (HibernateException e) {
            e.printStackTrace();
            tx.rollback();
            throw new DataAccessLayerException(e);
        }
        finally {
            return crc;
        }
    }

}

وفي المرشح الذي أستخدمه رمز التبات

session = HibernateUtil.getSessionFactory().getCurrentSession(); 
if(session.isOpen())
    session.getTransaction().commit();

هل هذا النهج الصحيح؟ هل يمكن أن يكون لها أي مشكلة.

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

المحلول

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

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

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