补充,配置文件没问题,如果hibernate连接的时候没有别的访问的话,hibernate就可以正常启动,不会重复加载~

解决方案 »

  1.   

    这是我用的~package cn.hlgc.util;import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;/**
     * HibernateSession工厂
     */
    public class HibernateUtil { /** Hibernate的配置文件hibernate.cfg.xml */
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    /** Session的线程本地变量 */
    private static final ThreadLocal threadLocal = new ThreadLocal();
    /** transaction的线程本地变量 */
    private static final ThreadLocal txThreadLocal = new ThreadLocal();
    private static Configuration configuration = new Configuration();
    private static org.hibernate.SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION; private HibernateUtil() {
    } /**
     * 获得一个线程本地化的Hibernate session实例
     * 
     * @return Session
     * @throws HibernateException
     */
    public static Session getSession() throws HibernateException {
    Session session = (Session) threadLocal.get(); if (session == null || !session.isOpen()) {
    if (sessionFactory == null) {
    rebuildSessionFactory();
    }
    session = (sessionFactory != null) ? sessionFactory.openSession()
    : null;
    threadLocal.set(session);
    } return session;
    } /**
     * Rebuild hibernate session factory
     */
    public static void rebuildSessionFactory() {
    try {
    configuration.configure(configFile);
    sessionFactory = configuration.buildSessionFactory();
    } catch (Exception e) {
    System.err.println("%%%% Error Creating SessionFactory %%%%");
    e.printStackTrace();
    }
    } /**
     * 关闭线程化的Hibernate session实例
     * 
     * @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
    Session session = (Session) threadLocal.get();
    threadLocal.set(null); if (session != null) {
    session.close();
    }
    } /**
     * return session factory
     * 
     */
    public static org.hibernate.SessionFactory getSessionFactory() {
    return sessionFactory;
    } /**
     * return session factory
     * 
     * session factory will be rebuilded in the next call
     */
    public static void setConfigFile(String configFile) {
    HibernateUtil.configFile = configFile;
    sessionFactory = null;
    } /**
     * return hibernate configuration
     * 
     */
    public static Configuration getConfiguration() {
    return configuration;
    } /**
     * 在本地session实例上开启事务
     */
    public static void beginTransaction() {
    Transaction tx = (Transaction) txThreadLocal.get();
    if (tx == null) {
    tx = getSession().beginTransaction();
    txThreadLocal.set(tx);
    }
    } /**
     * 在本地session实例上提交事务
     */
    public static void commitTransaction() {
    Transaction tx = (Transaction) txThreadLocal.get();
    if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
    tx.commit();
    txThreadLocal.set(null);
    }
    } /**
     * 在本地session实例上回滚事务
     */
    public static void rollbackTransaction() {
    Transaction tx = (Transaction) txThreadLocal.get();
    txThreadLocal.set(null);
    if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
    tx.rollback();
    }
    }}
      

  2.   

    将加载配置文件的语句放在static代码块中:
    static{
      configuration.configure(configFile);
      sessionFactory = configuration.buildSessionFactory();
    }
      

  3.   


        /**
         * Rebuild hibernate session factory
         */
        public static void rebuildSessionFactory() {
            try {
                configuration.configure(configFile);
                sessionFactory = configuration.buildSessionFactory();
            } catch (Exception e) {
                System.err.println("%%%% Error Creating SessionFactory %%%%");
                e.printStackTrace();
            }
        }
    请问这样不算放在static中?
      

  4.   

    把 buildSessionFactory 过程的方法加上同步关键字,这点很重要,也不影响性能,因为这具操作只需要执行一次。
      

  5.   

    你这个是只要调用rebuildSessionFactory()方法,就会重新加载配置文件,
    而放在static中的代码,实在java虚拟机加载这个类的时候执行,只执行一次
      

  6.   

    /**
     * Rebuild hibernate session factory
     */
    public synchronized static void rebuildSessionFactory() {
    try {
    configuration.configure(configFile);
    sessionFactory = configuration.buildSessionFactory();
    } catch (Exception e) {
    System.err.println("%%%% 创建 SessionFactory 失败 %%%%");
    e.printStackTrace();
    }
    }按照5楼的方法解决了~