Наличие проблемы с org.hibernate. SessionException: Сеанс закрыт! в В спящем режиме

Я сделал вполне немного исследование в области этого без удачи, но все ответы имеют тенденцию указать на настройки контекста сессии в файле конфигурации. То, что нечетно, - то, что я получаю соединение на время сеанса в самый первый раз, когда я поразил страницу (и поэтому, успешный набор результатов), но затем когда я перезагружаю, я получаю следующее исключение: org.hibernate. SessionException: Сеанс закрыт!

Вот мои настройки конфигурации, которые не являются связанной строкой соединения с БД:

<property name="hibernate.show_sql">false</property>
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>        
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="hibernate.cache.use_query_cache">false</property>
<property name="hibernate.cache.use_minimal_puts">false</property>

Вот пример вызова, который я выполняю, который производит ситуацию, которую я описал выше.

public T get(int id) {
    session.beginTransaction();
    T type;
    try {
        type = getTypeClass().cast(session.get(getTypeClass(), id));
    } catch (ClassCastException classCastException) {
        throw new ClassCastException(classCastException.getMessage());
    }
    session.getTransaction().commit();
    return type;
}

Ссылка переменной сеанса к статическому полю, которое содержит текущую сессию. Все детали соединения на время сеанса являются справочником учебника. Например, вот мой Быть в спящем режиме утилита сессии:

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateSessionFactoryUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            return new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}
9
задан Pascal Thivent 2 May 2010 в 17:05
поделиться

1 ответ

Когда вы получаете сеанс с sessionFactory.getCurrentSession () , сеанс сбрасывается и закрывается автоматически при совершении транзакции (см. Сеансы и транзакции для более подробной информации). Итак, я подозреваю, что 1. вы получаете сеанс раз и навсегда (это объясняет, почему первый вызов работает и почему последующие вызовы терпят неудачу), что неверно и 2. вы, кажется, используете сеанс для каждой операции , что еще хуже.

В веб-приложении вы должны использовать стратегию сеанс на запрос , что означает, что « один сеанс и одна транзакция базы данных реализуют обработку конкретного события запроса ". Снова обратитесь к документу Сеансы и транзакции .

И если вы хотите удалить демаркацию транзакции из своего кода доступа к данным, вы можете использовать перехватчик , чтобы запускать транзакцию базы данных в начале каждого запроса и фиксировать ее в конце запроса. Взгляните на Открытый сеанс в представлении для реализации этого шаблона (с примером DAO, демонстрирующим преимущества).

8
ответ дан 4 December 2019 в 22:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: