Hibernate 主配置文件
1. 前言
使用 Hibernate 時,需要經(jīng)常修改 Hibernate.cfg.xml 主配置文件中的信息, 這些信息至關(guān)重要,允許開發(fā)者按自己的需求訂制使用 Hibernate 。
本節(jié)課程將從 2 個方面幫助大家更好的理解 Hibernate.cfg.xml 主配置文件:
- 主配置文件的核心作用;
- 主配置文件中的可配置項有哪些。
2. 配置文件的作用
先了解一下設計模式和設計原則:
設計模式: 通俗講是一種編程技巧,是一門傳承的技術(shù)活,能讓代碼變得有靈性并時時散發(fā)出優(yōu)雅的氣息。
設計原則: 是 OOP 編程中需要遵守的設計法則,是使用設計模式的前置條件。
無論是什么框架,只要是和優(yōu)秀二字掛了邊:
- 框架整體代碼設計中必然嚴格遵循 OOP 的設計原則;
- 綜合使用設計模式讓整體代碼具有靈活性。
2.1 開閉原則
何謂開閉原則?
開閉原則的自述: 對于一個健壯的、功能完備的系統(tǒng)而言,后期應該允許系統(tǒng)功能的擴展和延伸,但請不要修改核心代碼。
可以擴展,但不允許修改代碼!這不有點扯嗎?如果你覺得有點扯,則說明下面內(nèi)容對于提升你的編程能力很有用。
筆記本電腦就遵循了開閉原則:
- 電腦是一個功能完備的硬件系統(tǒng);
- 但可通過外置 USB 接口的方式對接各種外部功能設備,任意擴展計算機的現(xiàn)有功能。
那么在程序中一般又是如何實現(xiàn)開閉原則的?
工廠設計模式
程序可通過工廠設計模式的方式實現(xiàn)開閉原則。
如下圖所示,這是一個簡單工廠的實現(xiàn)過程,幫助需求者 A 創(chuàng)建實現(xiàn)了接口 IB 的 B 對象 。

如果現(xiàn)在有 B1、B2、B3…… 這么一個對象群體,只要它們實現(xiàn)了 IB 接口,通過添加代碼,工廠還是可以創(chuàng)建它們。

但是在工廠類設計完畢后又出了實現(xiàn)了 IB 接口的 B3、B4、B5…… 新組件,A 對工廠說,我要使用它們,你幫我創(chuàng)建一下。對于工廠來講,又不得不修改自己的代碼。
那么,有沒有一種方式,不修改工廠的內(nèi)部代碼,就能讓工廠創(chuàng)建出最近出現(xiàn)的新組件?
當然有,使用配置文件。
2.2 配置文件
如何解決前面的問題?
配置文件
A 把自己對具體組件的需求寫入配置文件,工廠對象則:
- 讀取解析配置文件上的信息;
- 使用反射機制在運行時動態(tài)創(chuàng)建 A 所需要的組件。
是不是很完美地解決了開閉原則中自我矛盾的問題。
當然,絕對的開閉是不會出現(xiàn)的,不修改代碼,還是需要修改配置文件的,配置文件的套路是實現(xiàn)開閉原則的一種方案。

3. Hibernate 的主配置文件
聊回到 Hibernate,Hibernate 是一個框架,框架只是一個半成品應用程序。需要使用 Hibernate 完成一次具體的數(shù)據(jù)庫數(shù)據(jù)操作時,需要開發(fā)者的組件和 Hibernate 的組件通力合作。
對于 Hibernate 來說,如何知道開發(fā)者具體使用什么樣的數(shù)據(jù)庫、什么樣的持久化對象……
開發(fā)者只需要把這些信息寫入到配置文件中,Hibernate 就能通過讀取配置信息了解開發(fā)者的心意。
所以說主配置文件在 Hibernate 和 開發(fā)者之間充當了橋梁的作用,是內(nèi)外交流的通道。
Tips: 通過配置文件,在開發(fā)者和 Hibernate 之間進行信息傳遞,讓 Hibernate 能從容面對不同開發(fā)者的需求。
你有沒有覺得 Hibernate 把開閉原則用得很好呢!
知道了配置文件的作用,現(xiàn)在是時候了解 Hibernate 中的主配置文件能具體傳遞什么信息了。
3.1 可配置內(nèi)容
最小需求配置信息:
- Hibernate 運行的底層信息:數(shù)據(jù)庫的 URL、用戶名、密碼、JDBC 驅(qū)動類,數(shù)據(jù)庫 Dialect, 數(shù)據(jù)庫連接池等;
- Hibernate 映射文件(*.hbm.xml)或注解類位置。
配置信息遠不止上面這些,如緩存信息、事務信息……
主配置文件是開發(fā)者和 Hibernate 心靈相連的接口,要讓程序在生產(chǎn)環(huán)境中工作,需要交流的地方多了。
前面在主配置文件中出現(xiàn)的信息就不再啰嗦!下面羅列部分配置信息內(nèi)容!不要指望全部記?。。。。?/p>
屬性名 | 用途 |
---|---|
Hibernate.dialect | 針對特定的關(guān)系數(shù)據(jù)庫生成優(yōu)化的 SQL |
Hibernate.format_sql | 格式化輸出 SQL 語句(true,false) |
Hibernate.default_schema | 將給定的 schema/tablespace 附加到表名上(schema name) |
Hibernate.hbm2ddl.auto | 自動構(gòu)建數(shù)據(jù)庫結(jié)構(gòu),通過映射生成 DDL 語句。 create-drop: 運行時,先創(chuàng)建,運行完,再刪除 create: 每次運行前都會刪除已存在的再創(chuàng)建。 測試時,可以使用 create |
Hibernate.cache.use_query_cache | 允許查詢緩存,個別查詢?nèi)匀恍枰辉O置為可緩存的 |
Hibernate.cache_user_second_level_cache | 禁止使用二級緩存,對于在映射中定義中指定的類,會默認開啟二級緩存 |
Hibernate.cahce_query_cache_factory | 自定義實現(xiàn) querycache 接口的類名,默認為內(nèi)建的 standardQueryCache |
Hibernate 主配置文件的格式
Hibernate 提供了一個與配置文件有關(guān)的 Configuration 組件,它的功能是:
-
找到配置文件,讀取配置文件內(nèi)容;
-
告訴 Hibernate 應該如何響應開發(fā)者的請求。
Hibernate 提供有 2 種配置文件格式,格式不同 Configuration 讀取時也稍有差異性。
- 屬性文件(hibernate.properties)格式:在實例化 Configuration 組件時,Hiberntae 指定的默認配置文件;
Configuration cfg = new Configuration();
- XML 文件(hibernate.cfg.xml)格式:需要顯示調(diào)用 Configuration 組件的 configure()方法,此方法不帶參數(shù)時,默認會從 classpath 下尋找是否存在 hibernate.cfg.xml 文件。
Configuration cfg = new Configuration().configure();
hibernate 官方建議使用 Hibernate.cfg.xml 作為主配置文件名,當然完全可以修改成自己喜歡的名字,修改后讀取時則需要使用 Configuration 組件中提供的帶參數(shù)的 configure()方法。
public Configuration configure(String resource) throws HibernateException ;
建議初學者不要輕易改動。
3.2 編程配置
所謂編程配置,指通過代碼的方式添加配置內(nèi)容,如下代碼用編碼方式指定映射文件位置:
Configuration cfg = new Configuration().addResource("Student.hbm.xml").addResource("Teacher.hbm.xml");
如下代碼中指定的 PO 映射是通過注解方式實現(xiàn)的:
Configuration cfg = new Configuration().addClass(org.mk.po.Studentclass).addClass(org.mk.po.Teacher.class);
當然,除此之外,其它的信息都可以通過編程實現(xiàn):
Configuration cfg = new Configuration().addClass(org.mk.po.Studentclass).addClass(org.mk.po.Teacher.class).setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect").setProperty("hibernate.connection.datasource", "java:comp/env/jdbc/test").setProperty("hibernate.order_updates", "true");
至于是否選擇編程方式向 Hibernate 進行信息注入,由開發(fā)者自行決定。
4. 小結(jié)
到了本節(jié)內(nèi)容總結(jié)時間,會不會有點依依不舍!
本節(jié)課通過講解開閉原則引出了配置文件的重要性,希望能幫助學習者不僅僅了解配置文件內(nèi)容有哪些。更重要是幫助學習者了解配置文件在整個框架中的地位及存在的前因后果。
知其然的會忘記,知其所以然的則感同身受。