public static final ThreadLocal tLocalsess = new ThreadLocal();
public static final ThreadLocal tLocaltx = new ThreadLocal();
public static void commitTransaction() {
Transaction tx = (Transaction) tLocaltx.get();
System.out.println(tx.toString());
try {
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
tx.commit();
tLocaltx.set(null);
System.out.println("commit tx");
} catch (HibernateException e) {
e.printStackTrace();
//这里报错 org.hibernate.SessionException: Session is closed

}
执行到tx.commit();的时候会报错org.hibernate.SessionException: Session is closed
这个问题大概会是出在什么地方?

解决方案 »

  1.   

    还有,配置文件是不是autocommit?
      

  2.   

    Hibernate Session is closed.
      

  3.   

    感谢楼上几位的回复这个方法所在的类名字叫HibernateUtil,内容是:
    package com.audit.dao.hibernate;import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;public class HibernateUtil {
    private static final SessionFactory sessionFactory; static {
    try {
    // Create the SessionFactory
    sessionFactory = new Configuration().configure()
    .buildSessionFactory();
    } catch (Throwable ex) {
    ex.printStackTrace();
    System.out.println("Initial SessionFactory creation failed.");
    throw new ExceptionInInitializerError(ex);
    }
    } public static final ThreadLocal tLocalsess = new ThreadLocal(); public static final ThreadLocal tLocaltx = new ThreadLocal(); /*
     * getting the thread-safe session for using
     */
    public static Session currentSession() {
    Session session = (Session) tLocalsess.get(); // open a new one, if none can be found.
    try {
    if (session == null || !session.isOpen()) {
    session = openSession();
    tLocalsess.set(session);
    }
    } catch (HibernateException e) {
    // throw new HibernateException(e);
    e.printStackTrace();
    }
    return session;
    } /*
     * closing the thread-safe session
     */
    public static void closeSession() { Session session = (Session) tLocalsess.get();
    tLocalsess.set(null);
    try {
    if (session != null && session.isOpen()) {
    session.close();
    } } catch (HibernateException e) {
    e.printStackTrace();
    }
    } /*
     * begin the transaction
     */
    public static void beginTransaction() {
    System.out.println("begin tx");
    Transaction tx = (Transaction) tLocaltx.get();
    try {
    if (tx == null) {
    tx = currentSession().beginTransaction();
    tLocaltx.set(tx);
    }
    } catch (HibernateException e) {
    e.printStackTrace();
    }
    } /*
     * close the transaction
     */
    public static void commitTransaction() {
    Transaction tx = (Transaction) tLocaltx.get();
    System.out.println(tx.toString());
    try {
    //if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
    tx.commit();
    //closeSession();
    tLocaltx.set(null);
    System.out.println("commit tx");
    } catch (HibernateException e) {
    e.printStackTrace();
    //这里报错 org.hibernate.SessionException: Session is closed

    } /*
     * for rollbacking
     */
    public static void rollbackTransaction() {
    Transaction tx = (Transaction) tLocaltx.get();
    try {
    tLocaltx.set(null);
    if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
    tx.rollback();
    }
    } catch (HibernateException e) {
    //e.printStackTrace();
    }
    } private static Session openSession() throws HibernateException {
    return getSessionFactory().openSession();
    } private static SessionFactory getSessionFactory() throws HibernateException {
    return sessionFactory;// SingletonSessionFactory.getInstance();
    }
    }
    下面是调用:
    public List getProvince() {
    // TODO Auto-generated method stub
    try {
    Session s = HibernateUtil.currentSession();
    HibernateUtil.beginTransaction();
    List results = s.createQuery("from Province province").list();
    HibernateUtil.commitTransaction();
    HibernateUtil.closeSession();
    if (results != null && results.size() > 0) {
    return results;
    }
    } catch (HibernateException e) {
    log.fatal(e);
    }
    return null;
    }
      

  4.   

    我不知道你为什么定义两个这样的对象:
    public static final ThreadLocal tLocalsess = new ThreadLocal();public static final ThreadLocal tLocaltx = new ThreadLocal();你注意看你的currentSession方法,调用openSession方法的是tLocalsess对象,而beginTransaction方法使用Transaction的是tLocaltx对象。
      

  5.   

    这个我也不太清楚,这是某书上的例子,我仿照着做的,登录的地方用这个没问题的数据录入用这个,写入后,无法commit,关闭后数据没有保存。但是id却增加了。比如说现在有id=1,2。增加2个,id就有3,4。关闭后看数据库还是1,2,再运行程序,添加,id是从5开始
      

  6.   

    用一个对象试试,后面的beginTransaction方法也使用tLocalsess对象