web-dev-qa-db-ja.com

Hibernateセッションが閉じています

次のようにメソッドsession.beginトランザクションを呼び出すと、

//session factory is instantiated via a bean
Session session = this.getSessionFactory().getCurrentSession();
session.beginTransaction();

次に、次の例外メッセージが表示されます

6:13:52,217 ERROR [STDERR] org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.Java:49)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.Java:1319)

このエラーの原因は何ですか?

16

pdate:getCurrentSession()を呼び出しても、セッションが実際に開かれているとは限りません。初めて、あなたは使うべきです

Session session = this.getSessionFactory().openSession();
session.beginTransaction();

代わりに。この提案は実際にあなたが見つけたページと一致しています。

以前:

これまでに入手した情報に基づいて、エラーの原因はセッションが開いていないことであると結論できます;-)

27
Péter Török

私は答えを見つけたと思います:

セッションは終了しています

まだ実装していません

7

このアノテーションをコントローラーメソッドで使用できます。

@Transactional(readOnly = true)
4
ACV

セッションを完全に閉じる代わりに、session.disconnect()を使用して他の作業を行ってから、他のトランザクションを実行する前にsession.reconnect()を使用できます。

session.close()は、リクエスト/ビジネスプロセスの最後に呼び出されます。

Hibernate 2.1.8ではリクエストごとに1セッションを使用しており、セッションリークなどを回避してうまく機能します。

詳細については こちら を参照してください

1
Bizmarck

これが理由かもしれません

session.close();
tx.commit();

正しい方法は次のとおりです。

tx.commit();
session.close();
0
Mohammed Afsul

私は1年前に同じHibernateセッションのクローズ問題を抱えていました。 私の質問

しかし、それは別の理由でした。誰かがこの問題に直面し、それについて詳しく知りたい場合に備えて、ここに配置しました。

0
Saher Ahwal

次の解決策が私にとってうまくいきました:

@SuppressWarnings("unchecked")
public List<Enfermedad> obtenerEnfermedadesOrderByProcal() throws HibernateException {
    if (session==null)
        session = HibernateUtil.getSession();
    if (!session.isOpen())
        session = HibernateUtil.getSession();
    return session.createQuery("FROM Enfermedad AS e ORDER BY e.ordenPROCAL, e.id").list();
}
0
Nicolas400

セッションを処理するためにクローズされた例外:

1-)hibernate.cfgファイルで、デフォルトのhibernate.current_session_context_classmanagedではなくthreadに変更します

2-)2つのメソッドを作成してセッションを適切に開閉し、以下に示すようにクエリの前後を使用します。

 public static void renewSession() {
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.setFlushMode(FlushMode.MANUAL);
             ManagedSessionContext.bind(session);
             session.beginTransaction();
       } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static void closeSession()
    {
       try {
       ManagedSessionContext.unbind(HibernateUtil.getSessionFactory());
                  session.flush();
                 session.getTransaction().commit();
            session.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

使用法:

try {
                renewSession();
                String query = "from Table tb";
               data = (List<TypeObject>)session.createQuery(query).list();
                closeSession();
            } catch (Exception e) {
                e.printStackTrace();
            }
0
EngTiyeb