次のようにメソッド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)
このエラーの原因は何ですか?
pdate:getCurrentSession()
を呼び出しても、セッションが実際に開かれているとは限りません。初めて、あなたは使うべきです
Session session = this.getSessionFactory().openSession();
session.beginTransaction();
代わりに。この提案は実際にあなたが見つけたページと一致しています。
以前:
これまでに入手した情報に基づいて、エラーの原因はセッションが開いていないことであると結論できます;-)
このアノテーションをコントローラーメソッドで使用できます。
@Transactional(readOnly = true)
セッションを完全に閉じる代わりに、session.disconnect()
を使用して他の作業を行ってから、他のトランザクションを実行する前にsession.reconnect()
を使用できます。
session.close()
は、リクエスト/ビジネスプロセスの最後に呼び出されます。
Hibernate 2.1.8ではリクエストごとに1セッションを使用しており、セッションリークなどを回避してうまく機能します。
詳細については こちら を参照してください
これが理由かもしれません
session.close();
tx.commit();
正しい方法は次のとおりです。
tx.commit();
session.close();
私は1年前に同じHibernateセッションのクローズ問題を抱えていました。 私の質問
しかし、それは別の理由でした。誰かがこの問題に直面し、それについて詳しく知りたい場合に備えて、ここに配置しました。
次の解決策が私にとってうまくいきました:
@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();
}
セッションを処理するためにクローズされた例外:
1-)hibernate.cfgファイルで、デフォルトのhibernate.current_session_context_class
をmanaged
ではなく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();
}