getCurrentSession() против openSession()

Я пытаюсь использовать generic-dao (http://code.google.com/p/hibernate-generic-dao/ ). Однако в моем HibernateBaseDAO метод getSession() реализован как sessionFactory.getCurrentSession(). Это приводит к ошибке для любого обновления объекта

org.hibernate.HibernateException: createCriteria is not valid without active transaction

Однако, когда я использую openSession() вместо getCurrentSession(), это работает. Я не использую Spring как зависимость в pom.xml. Я читал об openSession() и getCurrentSession(), но до сих пор не могу понять, почему это происходит?


person obh    schedule 22.05.2013    source источник
comment
Вы указали спящий режим для использования ThreadLocalSessionContext?   -  person Juned Ahsan    schedule 22.05.2013
comment
да, я указал ThreadLocalSessionContext   -  person obh    schedule 22.05.2013


Ответы (2)


CurrentSession оказывается во многих ситуациях очень хрупким.

У вас может быть неопределенное состояние после ошибки, поэтому убедитесь, что ваш «текущий сеанс» и транзакция не были уничтожены предыдущей ошибкой. для этого распечатайте состояние транзакции (isActive) непосредственно перед вызовом getCurrentSession внутри DAO.

дважды проверьте, что SessionContext настроен и работает; дважды вызовите getCurrentSession и проверьте, совпадают ли возвращаемые экземпляры, если нет, возможно, вы просматриваете разные сеансы:

assert getCurrentSession()==getCurrentSession()

Я усвоил тяжелые уроки, чтобы быть очень консервативным со спящим режимом. Так что потраченное время на основы действительно окупается.

HTH Стив

person Steve Oh    schedule 22.05.2013

Нашел решение: с genericDAO он получает текущий сеанс, который необходимо явно открыть с помощью openSession(), а getCurrentSession() просто прикрепляет его к текущий сеанс. По мнению автора

GenericDAO предполагает, что вы будете обрабатывать транзакции вне DAO.

person obh    schedule 30.05.2013