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