1. 程式人生 > >Hibernate、Hibernate4獲取SessionFactory物件方法的變化

Hibernate、Hibernate4獲取SessionFactory物件方法的變化

Hibernate4獲取SessionFactory物件方法的變化

Hibernate用來獲取配置檔案的類是Configuration,若用Annotation的話就是AnnotationConfiguration類。

例:Configuration config = new Configuration();

config.configure("hibernate.cfg.xml");//configure()方法取得。

//或者config.configure();不用加引數,因為只有需要一個//hibernate.cfg.xmlsrc路徑下。Hibernate會自動匹配

取得配置檔案後:需要一個Session

物件來操作資料庫的存取。Session物件是有SessionFactory的物件來產生的。

4.0版本之前sessionFactory由取得配置檔案的物件config.BuildSessionFactory();產生。

SessionFactory sessionFactory =config.buildSessionFactory();

再由sessionFactory.getCurrentSession();方法產生session

Session session = sessionFactory.getCurrentSession();

有了session物件之後就可以對資料庫進行操作了。但

hibernate的所有操作都是建立在事務之上的。所以session操作之前要先開啟一個事務:

session.beginTransaction();

同理操作完之後要提交事務:

session.getTransaction().commit();

若出錯。可回滾:

session.getTransaction().roolback();(這兩句可放在tyr{……}catch{……}語句裡面)

另外還要關閉session物件:

session.close();

升級到4.0之後取得session的方法有所改變,hibernate增加了一個註冊機ServiceRegistryBuilder 類。要先生成一個註冊機物件,然後所有的生成

SessionFactory的物件要象註冊機註冊一下再用。生成方法還是config.buildSessionFactory()方法,不過加了個註冊機的引數。config.buildSessionFactory(ServiceRegistry  registry);

具體方法如下:

ServiceRegistry resgistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();

SessionFactory  factory = config.buildSessionFactory(resgistry);

Session session = factory.openSession();

SessionFactory的一段經典程式碼

當我們去拿hibernate4sessionFactory時,我們發現原來使的一直很順手的new Configuration().configure().buildSessionFactory()中的buildSessionFactory方法已經過期了,取而代之的是buildSessionFactory(ServiceRegistry serviceRegistry)方法。檢視ServiceRegistry的構造方法,頓時感覺天旋地轉,這相當地令人抓狂,不過hibernate可能有其自己的考慮。

經過自己去google,發現了一段經典的取ServiceRegistry的程式碼,不敢獨享,特貼出來與大家共享!

privatestaticSessionFactory sessionFactory;
privatestaticServiceRegistry serviceRegistry;
privatestaticSessionFactory configureSessionFactory()throwsHibernateException{
Configuration configuration =newConfiguration();
    configuration.configure();
    serviceRegistry =newServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
相關程式碼:

package cn.framework.dao.util;

import org.hibernate.HibernateException; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {    //Hibernate  public static SessionFactory sessionfactory = null;

 static {   try {    // 通過hibernate.cfg.xml 產生一個SessionFactory    sessionfactory = new Configuration().configure().buildSessionFactory();   } catch (Throwable ce) {    ce.printStackTrace();   }  }      //Hibernate4  private static SessionFactory sessionFactory;  private static ServiceRegistry serviceRegistry;

 public static SessionFactory configureSessionFactory()throws HibernateException {   Configuration configuration = new Configuration();   configuration.configure();   serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();   sessionFactory = configuration.buildSessionFactory(serviceRegistry);   return sessionFactory;  } }