Почему я получаю org.hibernate.hibernateException: нет CurrentSessionContext Conficived

Я пишу простой проект, бизнес-приложение, написанное на качелях, используя Hibernate для Back-End. Я приезжаю от весны, что дал мне легкие способы использовать гибернацию и транзакции. Во всяком случае, мне удалось работать в гибернации. Вчера, во время записи некоторых кода, чтобы удалить боб из БД, я получил это:

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

Код удаления просто:

    Session sess = HibernateUtil.getSession();
    Transaction tx = sess.beginTransaction();
    try {
        tx.begin();
        sess.delete(ims);
    } catch (Exception e) {
        tx.rollback();
        throw e;
    }
    tx.commit();
    sess.flush();

и My Hibernateutil.getsession () :

    public static Session getSession() throws HibernateException {
        Session sess = null;
        try {
            sess = sessionFactory.getCurrentSession();
        } catch (org.hibernate.HibernateException he) {
            sess = sessionFactory.openSession();
        }
        return sess;
    }

Дополнительные детали: Я никогда не закрываю сеанс гибернации в моем коде, только на закрытии приложений. Это неправильно? Почему я получаю это на удалении (только для этого боба, другие делают работу), и я не на других операциях (вставка, запрос, обновление)?

Я читал вокруг, и я пытался изменить мою Метод просто в Sessionfactory.getCurrentsionCall () , но я получил: org.hibernate.hibernateException: нет CurrentSessionContext Conficate!

Hibernat Conf:

<hibernate-configuration>
    <session-factory >
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost/joptel</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">******</property>
    <property name="hibernate.connection.pool_size">1</property>
    <property name="show_sql">true</property>
    <property name="hibernate.hbm2ddl.auto">update</property>


    ..mappings..

    </session-factory>
</hibernate-configuration>
21
задан Marcelo 31 March 2013 в 21:10
поделиться

1 ответ

Не настроен CurrentSessionContext

Прочтите справочное руководство по Контекстуальные сеансы . Для этого вам необходимо настроить предоставленную или пользовательскую стратегию . В файле hibernate.cfg.xml вы должны настроить его на

<property name="hibernate.current_session_context_class">...</property>

. Возможно, вы захотите использовать «поток» в качестве значения для получения сеансов для каждого потока. При использовании Spring он автоматически устанавливает его в SpringSessionContext , что позволяет Spring легко интегрировать Hibernate с его структурой управления транзакциями.

Я родом из Spring, который дал мне простые способы использования гибернации и транзакций.

Если вы знакомы с Spring, почему вы не используете его для управления Hibernate здесь? Вы уже должны знать, насколько это просто и надежно.

Я никогда не закрываю сеанс гибернации в своем коде, только при закрытии приложения. Это неправильно?

Да, это очень неправильно. Каждый не закрытый сеанс является открытым соединением с базой данных, поэтому ваше приложение в настоящий момент теряет связь.

Незаконная попытка связать коллекцию с двумя открытыми сессиями

Это означает именно то, что она говорит. Вы попытались выполнить некоторую операцию сохранения (save (), update (), delete ()) для чего-то, что уже было связано с другим сеансом. Это то, что произойдет, когда вы будете открывать новые сеансы случайным образом всякий раз, как это происходит, поскольку SessionFactory.getCurrentSession () всегда завершается ошибкой, если не установлен «текущий контекст сеанса». В общем, никогда не открывали сессию только потому, что ее там не было. Вы должны иметь четко определенные стратегии для открытия и закрытия сессий и никогда не позволять ничему открывать сессию вне этих «стратегий». Это верный путь к утечкам ресурсов и ошибкам, подобным той, с которой вы столкнулись.

10
ответ дан 29 November 2019 в 06:29
поделиться
Другие вопросы по тегам:

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