Спящий ленивый раствор. Это правильно? - PullRequest
0 голосов
/ 24 апреля 2009

Я использую следующий подход для решения проблемы отложенной инициализации в спящем режиме. Пожалуйста, скажите мне, будет ли это работать или нет. По некоторым причинам я должен выполнить мой транскейшн в слое персистентности.

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();

Правильный ли этот подход? Может ли это иметь какие-либо проблемы.

1 Ответ

0 голосов
/ 24 апреля 2009

Убедитесь, что вы всегда фиксируете или откатываете, а затем всегда закрываете сеанс. По сути, ваши ресурсы (транзакция и сеанс) должны быть освобождены независимо от того, что, например, они могут быть размещены внутри соответствующего блока finally (в случае сеанса) или в обоих блоках try и catch (в случае транзакции).

Как правило, распределение и освобождение ресурсов между различными уровнями приложений - это анти-паттерн - если ваша архитектура заставляет вас применять анти-паттерн, тогда есть еще вопросы, которые можно задать здесь ... Например, подумайте, что вы должны делать в вашем "фильтре", если сессия будет закрыта ...

...