当我按如下方式调用方法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)
导致此错误的原因是什么?
答案 0 :(得分:25)
更新:我猜调用getCurrentSession()
并不能保证会话实际上是开放的。这是第一次,你应该使用
Session session = this.getSessionFactory().openSession();
session.beginTransaction();
代替。此建议实际上与您找到的页面一致。
<强>早些时候:强>
根据目前可获得的信息,我们可以得出结论,错误的原因是会话没有打开; - )
答案 1 :(得分:7)
答案 2 :(得分:4)
您可以在控制器方法上使用此注释:
@Transactional(readOnly = true)
答案 3 :(得分:1)
在完成其他交易之前,您可以使用session.disconnect()
,执行其他工作,然后执行session.reconnect()
,而不是完全关闭会话。
session.close()
将在请求/业务流程的最后调用。
在Hibernate 2.1.8中,我们每个请求模型使用一个会话,它运行良好,避免会话泄漏等。
有关详细说明,请参阅here
答案 4 :(得分:0)
这可能是原因
session.close();
tx.commit();
正确的方法是:
tx.commit();
session.close();
答案 5 :(得分:0)
一年前我有同样的Hibernate Session Closed Problem。 MY QUESTION
但是出于不同的原因,我把它放在这里,万一有人面临这个问题,想要了解更多。
答案 6 :(得分:0)
要处理会话已关闭的异常:
1-)在您的hibernate.cfg文件中,将默认的hibernate.current_session_context_class
更改为managed
而不是thread
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();
}
答案 7 :(得分:0)
以下解决方案对我有用:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-76-9d98d7b11202> in <module>
2 from sklearn.neighbors import KNeighborsClassifier
3
----> 4 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
5
6 print(X_train)
~/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_split.py in train_test_split(*arrays, **options)
2094 raise TypeError("Invalid parameters passed: %s" % str(options))
2095
-> 2096 arrays = indexable(*arrays)
2097
2098 n_samples = _num_samples(arrays[0])
~/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py in indexable(*iterables)
228 else:
229 result.append(np.array(X))
--> 230 check_consistent_length(*result)
231 return result
232
~/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py in check_consistent_length(*arrays)
203 if len(uniques) > 1:
204 raise ValueError("Found input variables with inconsistent numbers of"
--> 205 " samples: %r" % [int(l) for l in lengths])
206
207
ValueError: Found input variables with inconsistent numbers of samples: [24946, 22451400]