ленивое решение для перехода в спящий режим.Правильно ли это?
-
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 (в случае транзакции).
В общем, распределение и высвобождение ресурсов на разных уровнях приложения противоречит шаблону - если ваша архитектура вынуждает вас применять антишаблон, то здесь можно задать больше вопросов...Например, подумайте о том, что вы должны сделать в своем "фильтре", если сеанс окажется закрытым...