В настоящее время нет сеанса, привязанного к контексту выполнения

Я получил исключение ниже, когда использовал session.getCurrentSession().

я упомянул

hibernate.current_session_context_class: managed

org.hibernate.HibernateException: No session currently bound to execution context
    at org.hibernate.context.internal.ManagedSessionContext.currentSession(ManagedSessionContext.java:75)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
    at io.dropwizard.hibernate.AbstractDAO.currentSession(AbstractDAO.java:36)
    at io.dropwizard.hibernate.AbstractDAO.persist(AbstractDAO.java:149)

Я использую это с dropwizard. Может ли кто-нибудь помочь мне решить эту проблему?


person Srinivas    schedule 13.05.2015    source источник
comment
Код, пожалуйста, предоставьте код, который вызывает исключение   -  person Master Mind    schedule 13.05.2015
comment
Изначально я написал Query для получения информации из БД. Это будет выполнено. Но после этого я сохранял данные в другие таблицы. Это дает ошибку. Я думал, что сеанс будет закрыт после выполнения моего первого взаимодействия с БД. Но этого следовало ожидать, так как я использую hibernate.current_session_context_class: manage   -  person Srinivas    schedule 13.05.2015
comment
Код будет слишком длинным, чтобы вставить его   -  person Srinivas    schedule 13.05.2015
comment
вы запускаете класс приложения и конфигурацию вашего HibernateBundle, по крайней мере, чтобы мы могли помочь   -  person Master Mind    schedule 13.05.2015
comment
Я думаю, что лучший подход здесь — открывать и закрывать сеанс для каждого действия.   -  person cнŝdk    schedule 13.05.2015
comment
Как вы объявляете свою сессию, покажите нам соответствующий код.   -  person cнŝdk    schedule 13.05.2015


Ответы (2)


Если вы используете Dropwizard Hibernate. Вам нужно добавить аннотацию @UnitOfWork к методу Resource. Дополнительные сведения см. в руководстве по dropwizard, главе о спящем режиме. .

person yunspace    schedule 14.05.2015

Можете ли вы попробовать: session.openSession() - Он сообщает спящему режиму всегда открывать новый сеанс, и вы должны закрыть его после завершения операций. С session.getCurrentSession() спящий режим возвращает сеанс, привязанный к контексту, который вам не нужно закрывать, и вам нужно только установить hibernate.current_session_context_class в поток.

Вы также можете настроить сеанс с помощью SpringSessionContext, если ваше приложение основано на Spring.

Отредактируйте свой hibernate-cfg.xml строкой ниже:

hibernate.current_session_context_class=org.springframework.orm.hibernate3.SpringSessionContext

Что будет делать строка выше?

Создав класс контекста сеанса как "org.springframework.orm.hibernate3.SpringSessionContext", Hibernate будет считать, что он выполняется внутри транзакционного контекста Spring (т. е. через транзакционный аспект Spring), и Spring теперь будет управлять вашим сделка для вас. Однако, если вы вызовете getCurrentSession() вне такого контекста, Hibernate выдаст исключение, жалуясь на то, что ни один сеанс не привязан к потоку.

person Arpit Aggarwal    schedule 13.05.2015