MOYUN(/Java/SQL/Linux/DevOps/运维/架构/管理/敏捷/开发)

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

发现Hibernate4已经将configuration的buildSessionFactory方法已经划线了,说明已经过时了。

后来参看hibernate源码。以及API帮助文档,发现Hibernate4新增了一个接口ServiceRegistry,

所有基于Hibernate的配置或者服务都必须统一向这个ServiceRegistry注册后才能生效。

所以不难看出 Hibernate4的配置入口不再是Configuration对象,而是ServiceRegistry对象,Configuration对象将通过ServiceRegistry对象获取配置信息。

使用了Builder模式创建一个ServiceRegistry对象,可以看到源码org.hibernate.service.ServiceRegistryBuilder这个类。
代码如下:(hibernate4.1.7)

    /**
     * ServiceRegistry是Hibernate4.X新增接口, 
     * 应用于Hibernate的配置或者服务等将统一向这个ServiceRegistry注册后才能生效。 
     * 所以需要构建一个ServiceRegistry对象,将配置信息向它注册,
     * 然后Configuration对象根据从这个ServiceRegistry对象中获取配置信息生成SessionFactory。
     * Hibernate4的配置入口不再是Configuration对象,而是ServiceRegistry对象,
     * Configuration对象将通过ServiceRegistry对象获取配置信息。 
     * hibernate4 源码位置:org.hibernate.service.ServiceRegistryBuilder   
     * 具体可参看hibernate源码。以及API
     * */

hibernate-cfg.xml

    <session-factory>
        <property name="hibernate.connection.provider_class" >org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">test</property>
        <property name="connection.pool_size">1</property>  
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>  
        <property name="current_session_context_class">thread</property>
        <property name="javax.persistence.validation.mode">none</property>
        <property name="show_sql">true</property> 
        <property name="hbm2ddl.auto">update</property>
        <property name="hibernate.c3p0.max_size">20</property>    
        <property name="hibernate.c3p0.min_size">5</property>    
        <property name="hibernate.c3p0.timeout">120</property>    
        <property name="hibernate.c3p0.max_statements">100</property>    
        <property name="hibernate.c3p0.idle_test_period">3000</property>    
        <property name="hibernate.c3p0.acquire_increment">2</property>
        <property name="myeclipse.connection.profile">entity_table</property>
        <property name="show_sql">true</property>
        <mapping class="entity.Activate" />
    </session-factory>

GetSessionUtils.java

    static{
        try {
            
            configuration =  new Configuration().configure();  
            serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry); 
        }catch(HibernateException e){
            
            e.printStackTrace();
        }
    }
    
    public static Session getSession() {  
        
        Session session = null; 
        if(null==session || false==session.isOpen()){  
            session = sessionFactory.openSession();
        }  
        return session; 
    }

    public static void closeSession(Session session){ 
        try {  
            if(null!=session && session.isOpen())  
                session.close();  
        } catch (HibernateException e) {  
            e.printStackTrace();  
        }  
    }

 

posted on 2014-03-25 16:39  moyun-  阅读(1562)  评论(0)    收藏  举报