官术网_书友最值得收藏!

1.6 Hibernate核心接口

在本章1.4節(jié)中,用到了若干個Hibernate的接口,這些接口都是Hibernate的核心接口,下面是對它們的說明。

1.6.1 Configuration接口

Configuration對象用來配置和引導(dǎo)Hibernate,一個Hibernate應(yīng)用使用一個Configuration實(shí)例來指定主配置文件的位置,然后創(chuàng)建會話工廠。

在代碼中,配置文件是自動探測的,Configuration cfg = new Configuration().configure();中的configure()方法未帶參數(shù)時,Hibernate在classpath根路徑下搜索名為hibernate.cfg.xml的文件,如果沒有找到將會拋出異常。這就是為什么要將Hibernate主配置文件命名為hibernate.cfg.xml,并且將其放在src目錄下(src目錄映射到編譯后的classpath根路徑)的原因。當(dāng)然,也可以另行配置和指定Hibernate主配置文件的路徑及名稱,例如:

        Configuration cfg = new Configuration().configure("/cfg/h4.cfg.xml")

1.6.2 SessionFactory接口

一個Hibernate應(yīng)用從SessionFactory(會話工廠)里獲得會話實(shí)例。會話工廠是一個典型的工廠模型,它可以被多個線程共享,提供會話。一般情況下,整個應(yīng)用只有唯一的一個SessionFactory,它在應(yīng)用初始化時被創(chuàng)建。如果應(yīng)用需要使用Hibernate訪問多個數(shù)據(jù)庫,則需要對每一個數(shù)據(jù)庫使用一個SessionFactory。SessionFactory緩存了生成的SQL語句和Hibernate在運(yùn)行時使用的元數(shù)據(jù)。

一個常見的問題是,SessionFactory在創(chuàng)建之后如何存儲和訪問,既可以保持其單例性質(zhì)又不要太麻煩。具體有JNDI、JMX等方式,在這里要介紹一種最直觀和快捷的解決方式,即編寫一個工具類,將SessionFactory的實(shí)例設(shè)置為靜態(tài)成員(只在內(nèi)存中存在一份)并將其初始化的代碼放在靜態(tài)初始化塊中(只執(zhí)行一次)。這個工具類在Hibernate社區(qū)相當(dāng)知名,其基本實(shí)現(xiàn)如下:

        package org.ijob.util;
        import org.Hibernate.SessionFactory;
        import org.Hibernate.cfg.Configuration;
        import org.Hibernate.service.ServiceRegistry;
        import org.Hibernate.service.ServiceRegistryBuilder;
        public class HibernateUtil {
            private static SessionFactory sessionFactory; //靜態(tài)變量
            static{                           //靜態(tài)初始化塊
                try {
                    Configuration cfg = new Configuration().configure();
                    //Hibernate4提供的新方式
                    ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
                        .applySettings(cfg.getProperties()).buildServiceRegistry();
                    sessionFactory = cfg.buildSessionFactory(serviceRegistry);
                } catch (Throwable ex) {
                    throw new ExceptionInInitializerError(ex);
                }
            }
            public static SessionFactory getSessionFactory() {
                return sessionFactory;
            }
            public static void shutdown() {
                getSessionFactory().close();
            }
        }

在工具類中,構(gòu)建SessionFactory的方式不是以前大家熟知的方式,例如:

        Configuration cfg = new Configuration().configure();
        sessionFactory = cfg.buildSessionFactory();

從Hibernate4開始,推薦的方式是:

org.hibernate.cfg.Configuration buildSessionFactory(ServiceRegistry serviceRegistry)

需要先構(gòu)造一個ServiceRegistry對象。這個對象,目前無須深究,只要照做就行了。

現(xiàn)在,獲取Session實(shí)例的代碼就可以這樣寫:

        Session session = HibernateUtil.getSessionFactory().openSession();

1.6.3 Session接口

Session(會話)接口是Hibernate應(yīng)用使用的主要接口,它擁有操作持久化對象的一系列API,可用于管理(例如加載和保存)對象,因此也稱為“持久化管理器”。它的內(nèi)部是一系列的SQL語句,在某個點(diǎn)會與數(shù)據(jù)庫同步。

Session實(shí)例是輕量級的,創(chuàng)建與銷毀的代價不昂貴,通常會為每個事務(wù)創(chuàng)建一個Session實(shí)例,并在使用后關(guān)閉它。Session實(shí)例并不是線程安全的,因此應(yīng)該被設(shè)計為每次只能在一個線程中使用。

注意:Hibernate會話與Web層的HttpSession沒有任何關(guān)系,在本書中使用的會話,指的是Hibernate會話。

1.6.4 Transaction接口

Transaction(事務(wù))接口是對實(shí)際事務(wù)實(shí)現(xiàn)的一個抽象,這些實(shí)現(xiàn)包括JDBC事務(wù)或者JTA事務(wù)等。這樣的設(shè)計允許開發(fā)人員在代碼中使用統(tǒng)一的事務(wù)操作接口,為項目在不同事務(wù)環(huán)境間遷移提供了便利性。

Hibernate中的具體事務(wù)控制通過主配置文件中的配置來選擇。下面的配置內(nèi)容選擇了JDBC原生事務(wù)控制,如果注釋的行變換一下,選擇的就是JTA事務(wù)控制。

        <property name="transaction.factory_class">
            org.hibernate.transaction.JDBCTransactionFactory<!-- 默認(rèn)值 -->
            <!--使用JTA事務(wù)控制應(yīng)改為:org.hibernate.transaction.JTATransactionFactory -->
        </property>

在Transaction接口中主要定義了commit()和rollback()兩個方法,前者是提交事務(wù)的方法,后者是回滾事務(wù)的方法。

1.6.5 Query與Criteria接口

Query(查詢)接口允許在數(shù)據(jù)庫上執(zhí)行查詢,并控制查詢?nèi)绾尉唧w執(zhí)行。查詢可以使用HQL(后面課程會詳細(xì)介紹)或SQL。Query實(shí)例可用來綁定查詢參數(shù),限定查詢返回的結(jié)果數(shù),并且最終執(zhí)行查詢。Criteria與Query接口非常類似,它允許創(chuàng)建并執(zhí)行面向?qū)ο蠓绞降牟樵儭?/p>

主站蜘蛛池模板: 大洼县| 佛坪县| 崇礼县| 喜德县| 西乌珠穆沁旗| 洛浦县| 明溪县| 义乌市| 郎溪县| 青岛市| 灵川县| 定日县| 久治县| 梁平县| 东源县| 驻马店市| 临颍县| 平遥县| 易门县| 铜鼓县| 高阳县| 伊宁市| 金门县| 西充县| 永修县| 伊吾县| 昌吉市| 如皋市| 田东县| 丰宁| 武平县| 吉首市| 南开区| 漳州市| 田东县| 永仁县| 朝阳县| 平远县| 龙江县| 大新县| 灵川县|