2009-04-24 2 views
0

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

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

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

+0

http://community.jboss.org/wiki/OpenSessionInView – Bozho

ответ

0

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

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

+0

эй я не могу закрыть или передать транскрипцию в finaly или поймать или попытаться заблокировать, когда она бросает исключение инициализации LAzay. Это потому, что я пытаюсь ленивый выбор, и если я закрываю или фиксирую сессию, я хочу быть в состоянии ленивого fetc. Поэтому я пытался закрыть сеанс (если он не закрыт) в фильтре. Действительно ли мой apporach? Отвлечение внимания на ваш комментарий – user93796

+0

Вы в фильтре, верно? Если нет, то ваш подход не подходит. Если вы это сделаете, ваш подход, по крайней мере, возможен. В любом случае, мой ответ был сделан для вашего дела. – topchef