zoukankan      html  css  js  c++  java
  • 使用myeclipse生成的HibernateSessionFactory的合理性

    作为简单的一个单件模式,
    getSessionFactory()函数返回null是一个不合理的决定,可以返回一个没有初始化的SessionFactory对象,但是返回null就和这种模式的语意有冲突了。
     
    以下是用myeclipse5自动生成的代码:
     
    package model.sessionfatory;
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.cfg.Configuration;

    public class HibernateSessionFactory {
       
        private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
     private static final ThreadLocal threadLocal = new ThreadLocal();
        private  static Configuration configuration = new Configuration();
        private static org.hibernate.SessionFactory sessionFactory;
        private static String configFile = CONFIG_FILE_LOCATION;
        private HibernateSessionFactory() {
        }
     
     
        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;
        }
     
     public static void rebuildSessionFactory() {
      try {
       configuration.configure(configFile);
       sessionFactory = configuration.buildSessionFactory();
      } catch (Exception e) {
       System.err
         .println("%%%% Error Creating SessionFactory %%%%");
       e.printStackTrace();
      }
     }
     
        public static void closeSession() throws HibernateException {
            Session session = (Session) threadLocal.get();
            threadLocal.set(null);
            if (session != null) {
                session.close();
            }
        }
     
     public static org.hibernate.SessionFactory getSessionFactory() {
      return sessionFactory;
     }
     
     public static void setConfigFile(String configFile) {
      HibernateSessionFactory.configFile = configFile;
      sessionFactory = null;
     }
     
     public static Configuration getConfiguration() {
      return configuration;
     }
    }
     
    里边的这个函数:

     public static org.hibernate.SessionFactory getSessionFactory() {
      return sessionFactory;
     }
     
    是否应该修改为:

     public static org.hibernate.SessionFactory getSessionFactory() {
      rebuildSessionFactory();
      return sessionFactory;
     }
     
    这样调用代码:
      dao.setSessionFactory(HibernateSessionFactory.getSessionFactory());
    会报错误:
    java.lang.IllegalArgumentException: sessionFactory is required
     at org.springframework.orm.hibernate3.HibernateAccessor.afterPropertiesSet(HibernateAccessor.java:318)
     at org.springframework.orm.hibernate3.HibernateTemplate.<init>(HibernateTemplate.java:147)
     at org.springframework.orm.hibernate3.support.HibernateDaoSupport.createHibernateTemplate(HibernateDaoSupport.java:83)
     at org.springframework.orm.hibernate3.support.HibernateDaoSupport.setSessionFactory(HibernateDaoSupport.java:70)
     at test.TestOrgTypeDAO.testFindById(TestOrgTypeDAO.java:66)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
     at java.lang.reflect.Method.invoke(Unknown Source)
     at junit.framework.TestCase.runTest(TestCase.java:154)
     at junit.framework.TestCase.runBare(TestCase.java:127)
     at junit.framework.TestResult$1.protect(TestResult.java:106)
     at junit.framework.TestResult.runProtected(TestResult.java:124)
     at junit.framework.TestResult.run(TestResult.java:109)
     at junit.framework.TestCase.run(TestCase.java:118)
     at junit.framework.TestSuite.runTest(TestSuite.java:208)
     at junit.framework.TestSuite.run(TestSuite.java:203)
     at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)
     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
     
    而这样调用却不会错误:
      HibernateSessionFactory.rebuildSessionFactory();
      dao.setSessionFactory(HibernateSessionFactory.getSessionFactory());
  • 相关阅读:
    JavaWeb WebBrowserTool KernelEngine
    类模板 C++快速入门45
    动态数组的使用
    动态数组的使用
    鱼C小甲鱼
    栈原理演示
    鱼C小甲鱼
    类模板 C++快速入门45
    delphi实例
    栈原理演示
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4731810.html
Copyright © 2011-2022 走看看