- 使用Hibernate框架輕松連接數(shù)據(jù)庫(藍(lán)橋杯軟件大賽培訓(xùn)教材-Java方向)
- 工業(yè)和信息化部人才交流中心藍(lán)橋杯軟件大賽專家委員會編著
- 1237字
- 2018-12-27 17:47:36
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>
- SOA實(shí)踐
- Learning Docker
- 自己動手實(shí)現(xiàn)Lua:虛擬機(jī)、編譯器和標(biāo)準(zhǔn)庫
- Visual Basic程序設(shè)計習(xí)題解答與上機(jī)指導(dǎo)
- Mastering JBoss Enterprise Application Platform 7
- C程序設(shè)計實(shí)踐教程
- Mastering Backbone.js
- 深入剖析Java虛擬機(jī):源碼剖析與實(shí)例詳解(基礎(chǔ)卷)
- Visual C#.NET Web應(yīng)用程序設(shè)計
- 智能搜索和推薦系統(tǒng):原理、算法與應(yīng)用
- Nagios Core Administration Cookbook(Second Edition)
- Magento 2 Beginners Guide
- Java EE Web應(yīng)用開發(fā)基礎(chǔ)
- Python Web自動化測試設(shè)計與實(shí)現(xiàn)
- Elasticsearch Blueprints