спящий ленивый раствор. Это правильно?

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

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

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


person user93796    schedule 24.04.2009    source источник
comment
community.jboss.org/wiki/OpenSessionInView   -  person Bozho    schedule 23.07.2011


Ответы (1)


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

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

person topchef    schedule 24.04.2009
comment
эй, я не могу закрыть или зафиксировать транзакцию в блоке finaly или catch или try, поскольку он вызывает исключение инициализации LAzay. Это потому, что я пытаюсь выполнить ленивую выборку, и если я закрою или зафиксирую сеанс, я хочу иметь возможность ленивого извлечения, поэтому я пытался закрыть сеанс (если он не закрыт) в фильтре. Правильно ли мой подход?? Ждем вашего комментария - person user93796; 24.04.2009
comment
Вы делаете в фильтре в конце концов, не так ли? Если нет, то ваш подход неверен. Если вы это сделаете, то ваш подход, по крайней мере, осуществим. Мой ответ был сделан для вашего случая в любом случае. - person topchef; 24.04.2009