Здравствуйте.
Есть маленький проектик работающий с БД. В качестве ORM решения выбран Hibernate 4.
Попутно обуздывая фреймворк, создал классы сущностей, связал аннотациями, использовал DAO pattern. Но: в имплементации ДАО классов в каждом изменяющем БД методе сессия открывалась и закрывалась прямо в методе (как и в этой туториал ссылочке http://javaxblog.ru/article/java-hibernate-1/). Пример
Session session = null;
try {
session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
// Здесь добавляю, обновляю или удаляю
// ...
session.getTransaction().commit();
} catch (Exception e) {
// Обрабатываю
// rollback()
} finally {
// Закрываю
if (session != null && session.isOpen()) {
session.close();
}
}
Но что-то подсказывает, что это как-то, мягко говоря, не правильно.
Порыв немного интернет, наткнулся на статейку (https://developer.jboss.org/wiki/GenericDataAccessObjects), где говорится, что ДАО имплементации не должны создавать сессию внутри, а на неё нужно лишь ссылаться. Если я правильно понял, ДАО имплементаций не должно волновать создание сессий.
You could also use constructor injection. How you set the Session and what scope this Session has is of no concern to the actual DAO implementation. A DAO should not control transactions or the Session scope.
Интересует вопрос опытных разработчиков:
создавать ли сессию один раз на всё приложение и просто в сеттере давать ссылочку ДАО классам (при этом сессию не закрывать), или же в каждом методе ДАО класса создавать и закрывать сессию?
Ответ
Использование ссылки на SessionFactory внутри реализации DAO и создание сессии на каждый вызов дао методов. Для массивных изменений рекомендуется batch update.
Комментариев нет:
Отправить комментарий