org.hibernate.SessionException: Session was already closed
at org.hibernate.impl.SessionImpl.close(SessionImpl.java:320)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:345)
at $Proxy0.close(Unknown Source)
at com.test.TestHibernate.main(TestHibernate.java:80)
测试代码结构如下:
public class TecherTest {
private static Session session;
@BeforeClass
public static void BeforeClass()
{
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
}
@AfterClass
public static void afterClass() {
session.close();
}
@Test
public void testUpdate3(){
Teacher t = new Teacher();
t.setId(1);
t.setName("zc");
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.update(t);
session.getTransaction().commit();
}
}
解决方案就是:
将@AfterClass 中的session.close();删掉
1、当我们使用Session session = sessionFactory.getCurrentSession()时,不要去关闭session,而是由其自动关闭
2、如果我们一定要这样儿做,那就用isOpen()判断!