李蘋 孫若賢
摘要:Hibernate可以用映射關(guān)聯(lián)的方法解決面向?qū)ο蠹夹g(shù)與關(guān)系數(shù)據(jù)庫技術(shù)之間不匹配的問題,將應(yīng)用程序中的對象數(shù)據(jù)持久化到關(guān)系數(shù)據(jù)庫中。該文分析了Hibernate的工作原理、CRUD實現(xiàn)技術(shù),給出了關(guān)聯(lián)關(guān)系的映射實例。
關(guān)鍵詞:Hibernate;數(shù)據(jù)持久化
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2016)03-0012-02
Java程序與關(guān)系數(shù)據(jù)庫通信,可以使用JDBC編程技術(shù),將SQL語句嵌入到Java宿主語言中混合編程,程序中的代碼及SQL語句包含了對象模型與關(guān)系數(shù)據(jù)模型之間的映射關(guān)系。然而,嵌入了SQL語句的Java語言降低了程序的可讀性及獨立性,程序員需要面向?qū)ο笈c面向過程的思維轉(zhuǎn)換。利用Hibernate技術(shù)可以用面向?qū)ο缶幊趟季S來操縱數(shù)據(jù)庫,達到操作對象就是操作數(shù)據(jù)庫的目標,可以把SQL語句從程序代碼中分離出去,實現(xiàn)將內(nèi)存中的一個對象映射成關(guān)系數(shù)據(jù)庫表中一條記錄的持久化操作。
1 Hibernate的運行原理
Hibernate是屬于持久化的概念,是將內(nèi)存中的數(shù)據(jù)模型轉(zhuǎn)換為存儲模型,將實體類的定義、類的屬性與數(shù)據(jù)庫中的表和字段映射起來。
Hibernate通過Configuration類加載配置文件到內(nèi)存,讀取并解析配置文件,讀取并解析映射信息,創(chuàng)建SessionFactory對象。每個SessionFactory類的實例對應(yīng)一個數(shù)據(jù)庫,并負責(zé)創(chuàng)建Session實例。Session負責(zé)管理所有與持久化相關(guān)的CRUD操作。
2 Hibernate實現(xiàn)CRUD應(yīng)用
用Hibernate實現(xiàn)對關(guān)系模式:學(xué)生(學(xué)號,姓名,性別)的持久化操作,步驟如下:
(1)配置hibernate.cfg.xml文件,用于存放連接數(shù)據(jù)庫的有關(guān)信息。
……
(2)創(chuàng)建持久化類,將Java對象永久保存在數(shù)據(jù)庫中,當程序再次運行時重新加載到內(nèi)存,并重新構(gòu)造出對象。創(chuàng)建一個與學(xué)生表相關(guān)的持久化類,代碼如下:
public class Student {
private Integer sid;
private String sno;
private String sname;
private String ssex;
public Integer getSid() {
return sid; }
public void setSid(Integer sid) {
this.sid = sid; }
public String getSno() {
return sno; }
public void setSno(String sno) {
this.sno = sno; }
public String getSname() {
return sname; }
public void setSname(String sname) {
this.sname = sname; }
public String getSsex() {
return ssex; }
public void setSsex(String ssex) {
this.ssex = ssex; }}
(3)創(chuàng)建擴展名為hbm.xml的 XML文件來指定對象和關(guān)系數(shù)據(jù)之間的映射關(guān)系,在運行時,Hibernate將根據(jù)這個映射文件,將Student類映射到STUDENT表。
(4)CRUD操作
調(diào)用Session的save()方法,把對象持久化到數(shù)據(jù)庫中,相當于對表執(zhí)行INSERT操作。調(diào)用createQuery()方法對數(shù)據(jù)庫進行查詢,相當于對表上執(zhí)行SELECT操作。調(diào)用get()方法加載對象,可以修改對象的屬性,相當于對表執(zhí)行UPDATE操作。調(diào)用delete()方法刪除參數(shù)指定的對象,相當于對表執(zhí)行DELETE操作。
3 Hiberbate映射實體關(guān)聯(lián)關(guān)系應(yīng)用
在數(shù)據(jù)持久化操作中,存在實體關(guān)聯(lián)關(guān)系的映射,可以將數(shù)據(jù)庫中的一對一、一對多、多對多聯(lián)系映射到具體的對象操作中。實例如下:
關(guān)系模式學(xué)校(學(xué)校編號,名稱)與校長(校長編號,姓名)存在一對一的聯(lián)系,表明一所學(xué)校只有一個校長,一個校長只有在一所學(xué)校任職??梢圆捎没谕怄I的雙向一對一關(guān)聯(lián)映射。在創(chuàng)建的學(xué)校實例類中加入校長編號屬性,在校長類中加入學(xué)校編號屬性。并實現(xiàn)該屬性的setXxx()和getXxx()方法,分別用來獲取關(guān)聯(lián)和設(shè)置關(guān)聯(lián)的對象,即可以從學(xué)校查詢到校長,也可以從校長查詢到任職學(xué)校。在校長類的對象關(guān)系映射文件中通過many-to-one元素映射學(xué)校編號屬性,指定unqiue的屬性為true,表示校長實體到學(xué)校實體的一對一聯(lián)系。在學(xué)校類的對象映射文件中通過one-to-one元素映射從學(xué)校實體到校長實體的一對一關(guān)系。
關(guān)系模式學(xué)生(學(xué)號,姓名,性別)與班級(班級號,班級名)存在多對一的聯(lián)系,表明一個學(xué)生只能在一個班級,一個班級可以有多個學(xué)生??捎秒p向一對多關(guān)系映射。在班級類中定義集合類型的屬性,用來存儲學(xué)生對象,在學(xué)生類中定義班級類的屬性。在學(xué)生類的對象映射文件中用many-to-one元素指定被關(guān)聯(lián)的類的屬性為班級,外鍵為班級號。在班級類的對象映射文件中用one-to-many元素映射學(xué)生類,用集合的方式進行屬性設(shè)置。
關(guān)系模式課程(課程,課程名)與學(xué)生存在多對多的聯(lián)系,表明一個學(xué)生可以選多門課程,一門課程可以有多個學(xué)生選修??捎秒p向多對多關(guān)聯(lián)映射。在學(xué)生類中定義集合類型的課程屬性,用來存儲課程類對象。在課程類中定義集合類型的學(xué)生屬性,用來存儲學(xué)生類對象。在學(xué)生類的對象映射文件中用many-to-many元素指定被關(guān)聯(lián)的類的屬性為班級,用set元素映射集合屬性課程。在班級類的對象映射文件中用many-to-many元素指定被關(guān)聯(lián)的類的屬性為學(xué)生,用set元素映射集合屬性學(xué)生。
4 結(jié)束語
使用Hibernate技術(shù),程序員可以用面向?qū)ο蟮姆椒ㄔL問數(shù)據(jù)庫,使數(shù)據(jù)的管理和操作相分離,提高開發(fā)效率。
參考文獻:
[1] 許勇,王黎.Struts 2+Hibernate+Spring整合開發(fā)深入剖析與落伍應(yīng)用[M].北京:清華大學(xué)出版社,2013.
[2] 王國輝,馬文強.Hibernate應(yīng)用開發(fā)完全手冊[M].北京:人民郵電出版社,2007.
[3] 工業(yè)和信息化部人才交流中心藍橋杯軟件大賽專家委員會.使用Hibernate框架輕松連接數(shù)據(jù)庫[M].北京:電子工業(yè)出版社,2013.
[4] 孫衛(wèi)琴.Hibernate逍遙游記[M].北京:電子工業(yè)出版社,2010.