本帖最后由 hibernatewt 于 2011-06-12 20:21:53 编辑

解决方案 »

  1.   

    下面这话在 CSDN 我说过不下 100 次,实在不想再说什么了。不要把数据库连接对象 Connection, Statement/PreparedStatement, ResultSet 以及各种变形,诸如 Hibernate Session 等写成成员变量,更不能将其弄成静态的成员变量。 
      

  2.   

    好久以前用的,不过现在不喜欢用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 SessionFactory sessionFactory;
    //    private static HibernateUtil instance;
    //
    //    private HibernateUtil() {
    //        try {
    //            Configuration cfg = new Configuration().configure();
    //            sessionFactory = cfg.buildSessionFactory();
    //        } catch (HibernateException e) {
    //            e.printStackTrace();
    //            throw new ExceptionInInitializerError("Init hibernate error");
    //        }
    //    }
    //
    //    public static HibernateUtil getInstance() {
    //        if (instance == null) {
    //            synchronized (HibernateUtil.class) {
    //                if (instance == null) {
    //                    instance = new HibernateUtil();
    //                }
    //            }
    //        }
    //
    //        return instance;
    //    }
        
        static {
            try {
              Configuration cfg = new Configuration().configure();
              sessionFactory = cfg.buildSessionFactory();
          } catch (HibernateException e) {
              e.printStackTrace();
              throw new ExceptionInInitializerError("Init hibernate error");
          }
        }    public static Session getSession() {
            return sessionFactory.openSession();
        }
        
        public static void save(Object obj) {
            Session session = HibernateUtil.getSession();
            Transaction tx = null;        try {
                tx = session.beginTransaction();
                session.save(obj);
                tx.commit();
            } catch (HibernateException e) {
                e.printStackTrace();
                HibernateUtil.rollback(tx);
            } finally {
                HibernateUtil.closeSession(session);
            }
        }
        
        public static void saveObjects(Object... objs) {
            Session session = HibernateUtil.getSession();
            Transaction tx = null;
            
            try {
                tx = session.beginTransaction();
                for (int i = 0; i < objs.length; ++i) {
                    session.save(objs[i]);
                }
                tx.commit();
            } catch (HibernateException e) {
                e.printStackTrace();
                HibernateUtil.rollback(tx);
            } finally {
                HibernateUtil.closeSession(session);
            }
        }    public static void closeSession(Session session) {
            if (session != null) {
                try {
                    session.close();
                } catch (HibernateException e) {
                    e.printStackTrace();
                }
            }
        }
        
        public static void rollback(Transaction transaction) {
            if (transaction != null) {
                try {
                    transaction.rollback();
                } catch (HibernateException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    使用方法
        public void listUsers(String hql) {
            Session session = HibernateUtil.getSession();
            try {
                Query query = session.createQuery(hql);
                List users = query.list();
                Iterator iter = users.iterator();            while (iter.hasNext()) {
                    System.out.println(iter.next());
                }
            } catch (HibernateException e) {
                e.printStackTrace();
            } finally {
                HibernateUtil.closeSession(session);
            }
        }