ленивое решение для перехода в спящий режим.Правильно ли это?

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

  •  16-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top