在討論Hibernate與Jpa的關(guān)系是羊精,首先要明確Jpa的用途匾七。JPA全稱為Java Persistence API 絮短,Java持久化API是Sun公司在Java EE 5規(guī)范中提出的Java持久化接口。JPA吸取了目前Java持久化技術(shù)的優(yōu)點(diǎn)昨忆,旨在規(guī)范戚丸、簡化Java對象的持久化工作。使用JPA持久化對象,并不是依賴于某一個ORM框架限府。與Jpa相關(guān)的就是這個ORM技術(shù)夺颤,ORM 是Object-Relation-Mapping,即對象關(guān)系影射技術(shù)胁勺,是對象持久化的核心世澜。ORM是對JDBC的封裝,從而解決了JDBC的各種存在問題:
a) 繁瑣的代碼問題
用JDBC的API編程訪問數(shù)據(jù)庫署穗,代碼量較大寥裂,特別是訪問字段較多的表的時候,代碼顯得繁瑣案疲、累贅封恰,容易出錯。ORM則建立了Java對象與數(shù)據(jù)庫對象之間的影射關(guān)系褐啡,程序員不需要編寫復(fù)雜的SQL語句诺舔,直接操作Java對象即可,從而大大降低了代碼量备畦,也使程序員更加專注于業(yè)務(wù)邏輯的實現(xiàn)低飒。
b) 數(shù)據(jù)庫對象連接問題
關(guān)系數(shù)據(jù)對象之間,存在各種關(guān)系懂盐,包括1對1褥赊、1對多、多對1莉恼、多對多拌喉、級聯(lián)等。在數(shù)據(jù)庫對象更新的時候俐银,采用JDBC編程司光,必須十分小心處理這些關(guān)系,以保證維持這些關(guān)系不會出現(xiàn)錯誤悉患,而這個過程是一個很費(fèi)時費(fèi)力的過程。
ORM建立Java對象與數(shù)據(jù)庫對象關(guān)系影射的同時榆俺,也自動根據(jù)數(shù)據(jù)庫對象之間的關(guān)系創(chuàng)建Java對象的關(guān)系售躁,并且提供了維持這些關(guān)系完整、有效的機(jī)制茴晋。
c) 系統(tǒng)架構(gòu)問題
JDBC屬于數(shù)據(jù)訪問層陪捷,但是使用JDBC編程時,必須知道后臺是用什么數(shù)據(jù)庫诺擅、有哪些表市袖、各個表有有哪些字段、各個字段的類型是什么、表與表之間什么關(guān)系苍碟、創(chuàng)建了什么索引等等與后臺數(shù)據(jù)庫相關(guān)的詳細(xì)信息酒觅。
使用ORM技術(shù),可以將數(shù)據(jù)庫層完全隱蔽微峰,呈獻(xiàn)給程序員的只有Java的對象舷丹,程序員只需要根據(jù)業(yè)務(wù)邏輯的需要調(diào)用Java對象的Getter和 Setter方法,即可實現(xiàn)對后臺數(shù)據(jù)庫的操作蜓肆,程序員不必知道后臺采用什么數(shù)據(jù)庫颜凯、有哪些表、有什么字段仗扬、表與表之間有什么關(guān)系症概。
d) 性能問題
采用JDBC編程,在很多時候存在效率低下的問題早芭。
pstmt =conn.prepareStatement("insert into user_info values(?,?)");
for (int i=0; i<1000; i++) {
pstmt.setInt(1,i);
pstmt.setString(2,"User"+i.toString());
pstmt.executeUpdate();
}
以上程序?qū)⑾蚝笈_數(shù)據(jù)庫發(fā)送1000次SQL語句執(zhí)行請求彼城,運(yùn)行效率較低。
采用ORM技術(shù)逼友,ORM框架將根據(jù)具體數(shù)據(jù)庫操作需要精肃,會自動延遲向后臺數(shù)據(jù)庫發(fā)送SQL請求,ORM也可以根據(jù)實際情況帜乞,將數(shù)據(jù)庫訪問操作合成司抱,盡量減少不必要的數(shù)據(jù)庫操作請求。
知道Jpa是一種規(guī)范黎烈,而Hibernate是它的一種實現(xiàn)习柠。除了Hibernate,還有EclipseLink(曾經(jīng)的toplink)照棋,OpenJPA等可供選擇资溃,所以使用Jpa的一個好處是,可以更換實現(xiàn)而不必改動太多代碼烈炭。
在play中定義Model時溶锭,使用的是jpa的annotations,比如javax.persistence.Entity, Table, Column, OneToMany等等符隙。但它們提供的功能基礎(chǔ)趴捅,有時候想定義的更細(xì)一些,難免會用到Hibernate本身的annotation霹疫。我當(dāng)時想拱绑,jpa這 么弱還要用它干什么,為什么不直接使用hibernate的丽蝎?反正我又不會換成別的實現(xiàn)猎拨。因為我很快決定不再使用hibernate,這個問題就一直放下了。直到我現(xiàn)在在新公司红省,做項目要用到Hibernate额各。
我想拋開jpa,直接使用hibernate的注解來定義Model类腮,很快發(fā)現(xiàn)了幾個問題:
jpa中有Entity, Table臊泰,hibernate中也有,但是內(nèi)容不同蚜枢;
jpa中有Column,OneToMany等缸逃,Hibernate中沒有,也沒有替代品厂抽;
我原以為hibernate對jpa的支持需频,是另提供了一套專用于jpa的注解,但現(xiàn)在看起來似乎不是筷凤。一些重要的注解如Column, OneToMany等昭殉,hibernate沒有提供,這說明jpa的注解已經(jīng)是hibernate的核心藐守,hibernate只提供了一些補(bǔ)充挪丢,而不是兩 套注解。要是這樣卢厂,hibernate對jpa的支持還真夠足量乾蓬,我們要使用hibernate注解就必定要使用jpa。