JPA是一種規範,而hibernate是JPA的一種實現html
JPA全稱爲Java Persistence API ,Java持久化API是Sun公司在Java EE 5規範中提出的Java持久化接口。JPA吸收了目前Java持久化技術的優勢,旨在規範、簡化Java對象的持久化工做。使用JPA持久化對象,並非依賴於某一個ORM框架。java
JPA是目前比較流行的一種ORM技術之一,因此他擁有ORM技術的各類特色,固然他還有本身的一些優點:程序員
1 標準化sql
JPA 是 JCP 組織發佈的 Java EE 標準之一,所以任何聲稱符合 JPA 標準的框架都遵循一樣的架構,提供相同的訪問 API,這保證了基於JPA開發的企業應用可以通過少許的修改就可以在不一樣的JPA框架下運行。數據庫
2 對容器級特性的支持編程
JPA 框架中支持大數據集、事務、併發等容器級事務,這使得 JPA 超越了簡單持久化框架的侷限,在企業應用發揮更大的做用。設計模式
3 簡單易用,集成方便架構
JPA的主要目標之一就是提供更加簡單的編程模型:在JPA框架下建立實體和建立Java 類同樣簡單,沒有任何的約束和限制,只須要使用 javax.persistence.Entity進行註釋;JPA的框架和接口也都很是簡單,沒有太多特別的規則和設計模式的要求,開發者能夠很容易的掌握。JPA基於非侵入式原則設計,所以能夠很容易的和其它框架或者容器集成。併發
4 可媲美JDBC的查詢能力oracle
JPA的查詢語言是面向對象而非面向數據庫的,它以面向對象的天然語法構造查詢語句,能夠當作是hibernate HQL的等價物。JPA定義了獨特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一種擴展,它是針對實體的一種查詢語言,操做對象是實體,而不是關係數據庫的表,並且可以支持批量更新和修改、JOIN、GROUP BY、HAVING 等一般只有 SQL 纔可以提供的高級查詢特性,甚至還可以支持子查詢。
5 支持面向對象的高級特性
JPA 中可以支持面向對象的高級特性,如類之間的繼承、多態和類之間的複雜關係,這樣的支持可以讓開發者最大限度的使用面向對象的模型設計企業應用,而不須要自行處理這些特性在關係數據庫的持久化。
實例中使用的註釋列表以下。
註解 |
描述 |
@Entity |
聲明類爲實體或表。 |
@Table |
聲明表名。 |
@Basic |
指定非約束明確的各個字段。 |
@Embedded |
指定類或它的值是一個可嵌入的類的實例的實體的屬性。 |
@Id |
指定的類的屬性,用於識別(一個表中的主鍵)。 |
@GeneratedValue |
指定如何標識屬性能夠被初始化,例如自動,手動,或從序列表中得到的值。 |
@Transient |
指定的屬性,它是不持久的,即,該值永遠不會存儲在數據庫中。 |
@Column |
指定持久屬性欄屬性。 |
@SequenceGenerator |
指定在@GeneratedValue註解中指定的屬性的值。它建立了一個序列。 |
@TableGenerator |
指定在@GeneratedValue批註指定屬性的值發生器。它創造了的值生成的表。 |
@AccessType |
這種類型的註釋用於設置訪問類型。若是設置@AccessType(FIELD),而後進入FIELD明智的。若是設置@AccessType(PROPERTY),而後進入屬性發生明智的。 |
@JoinColumn |
指定一個實體組織或實體的集合。這是用在多對一和一對多關聯。 |
@UniqueConstraint |
指定的字段和用於主要或輔助表的惟一約束。 |
@ColumnResult |
參考使用select子句的SQL查詢中的列名。 |
@ManyToMany |
定義了鏈接表之間的多對多一對多的關係。 |
@ManyToOne |
定義了鏈接表之間的多對一的關係。 |
@OneToMany |
定義了鏈接表之間存在一個一對多的關係。 |
@OneToOne |
定義了鏈接表之間有一個一對一的關係。 |
@NamedQueries |
指定命名查詢的列表。 |
@NamedQuery |
指定使用靜態名稱的查詢。 |
JPA基礎教程:
JPA和hibernate關係
一些重要的註解如Column, OneToMany等,hibernate沒有提供,這說明jpa的註解已是hibernate的核心,hibernate只提供了一些補充,而不是兩 套註解。曾經看過兩個很經典的問題,
第一個是問若是想用hibernate註解,是否是必定會用到jpa的。網友的回答:「是。若是hibernate認爲jpa的註解夠用,就直接用。不然會弄一個本身的出來做爲補充」
第二個是問,jpa和hibernate都提供了Entity,咱們應該用哪一個,仍是說能夠兩個一塊兒用?網友回答說「Hibernate的Entity是繼承了jpa的,因此若是以爲jpa的不夠用,直接使用hibernate的便可」。
EJB:
http://www.yiibai.com/html/ejb
在J2EE裏,Enterprise Java Beans(EJB)稱爲Java 企業Bean,是Java的核心代碼,分別是會話Bean(Session Bean),實體Bean(Entity Bean)和消息驅動Bean(MessageDriven Bean)。在EJB3.0推出之後,實體Bean被單獨分了出來,造成了新的規範JPA
JPA和EJB關係:
簡單的說,JPA雖然出自EJB3,可是其使用的範圍卻大於EJB3,不只能夠在JavaEE5中,也能夠在JavaSE的環境中,如圖所示EJB3和JPA的關係.
JDBC:
Java語言訪問數據庫的一種規範,是一套API。JDBC (Java Database Connectivity) API,即Java數據庫編程接口,是一組標準的Java語言中的接口和類,使用這些接口和類,Java客戶端程序能夠訪問各類不一樣類型的數據庫。
爲了使客戶端程序獨立於特定的數據庫驅動程序,JDBC規範建議開發者使用基於接口的編程方式,即儘可能使應用僅依賴java.sql及javax.sql中的接口和類。
ORM:
ORM 是Object-Relation-Mapping,即對象關係影射技術,是對象持久化的核心。ORM是對JDBC的封裝,從而解決了JDBC的各類存在問題:
a) 繁瑣的代碼問題
用JDBC的API編程訪問數據庫,代碼量較大,特別是訪問字段較多的表的時候,代碼顯得繁瑣、累贅,容易出錯。例如:PreparedStatement pstmt=con.prepareStatment("insert into account value(?,?,?,?,?,?,?,?,?)");
ORM則創建了Java對象與數據庫對象之間的影射關係,程序員不須要編寫複雜的SQL語句,直接操做Java對象便可,從而大大下降了代碼量,也使程序員更加專一於業務邏輯的實現。
b) 數據庫對象鏈接問題
關係數據對象之間,存在各類關係,包括1對1、1對多、多對1、多對多、級聯等。在數據庫對象更新的時候,採用JDBC編程,必須十分當心處理這些關係,以保證維持這些關係不會出現錯誤,而這個過程是一個很費時費力的過程。
ORM創建Java對象與數據庫對象關係影射的同時,也自動根據數據庫對象之間的關係建立Java對象的關係,而且提供了維持這些關係完整、有效的機制。
c) 系統架構問題
JDBC屬於數據訪問層,可是使用JDBC編程時,必須知道後臺是用什麼數據庫、有哪些表、各個表有有哪些字段、各個字段的類型是什麼、表與表之間什麼關係、建立了什麼索引等等與後臺數據庫相關的詳細信息。
使用ORM技術,能夠將數據庫層徹底隱蔽,呈獻給程序員的只有Java的對象,程序員只須要根據業務邏輯的須要調用Java對象的Getter和 Setter方法,便可實現對後臺數據庫的操做,程序員沒必要知道後臺採用什麼數據庫、有哪些表、有什麼字段、表與表之間有什麼關係。
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();
}
以上程序將向後臺數據庫發送1000次SQL語句執行請求,運行效率較低。
採用ORM技術,ORM框架將根據具體數據庫操做須要,會自動延遲向後臺數據庫發送SQL請求,ORM也能夠根據實際狀況,將數據庫訪問操做合成,儘可能減小沒必要要的數據庫操做請求。
ORM框架:
目前ORM框架的產品很是之多,除了個大公司、組織的產品外,其餘一些小團隊也在推出本身的ORM框架。目前流行的ORM框架有以下這些產品:
(1)Enitiy EJB:Enitiy EJB實際上也是一種ORM技術,這是一直備受爭議的組件技術。事實上,EJB爲Java EE的蓬勃發展贏得了極高的聲譽,EJB做爲一種重量級、高花費的ORM技術具備不可比擬的優點。就其餘架構設計來說,依然很是優秀。即便如今十分流行的輕量級Java EE架構,其實質是對經典Java EE架構的模仿——雖然存在些許的改進。EJB3.1也採起了低侵入式的設計,增長了Annotation,也具備極大的吸引力。
(2)hibernate:目前最流行的開源ORM框架,已經被選做JBoss的持久層解決方案。整個HIbernate項目也一併投入了Jboss的懷抱,而JBoss又加入了RedHat組織,因此如今Hibernate屬於RedHat 的一部分。Hibernate 靈巧的設計、優秀的性能,還有其豐富的文檔都是其風靡全球的重要因素。
(3)iBatis: Apache軟件基金組織的子項目。與其稱它爲一種ORM框架,不如稱它爲一中「SQL Mapping」框架。曾經在J2EE的開發中扮演很是重要的角色,但由於不支持存粹的面向對象操做,所以如今逐漸地被取代。可是在一些公司,依然佔有一席之地,特別是一些對數據訪問特別靈活的地方,iBatis更加的靈活,它容許開發人員直接編寫SQL語句。
(4)TopLink:Oracle公司的產品,做爲一個遵循OTN協議的商業產品,TopLink 在開發過程當中能夠自由地下載和使用,可是一旦做爲商業產品被使用,則須要收取費用。因爲這一點,TopLink 的市場佔有率不高。
(5)OBJ:Apache軟件基金組織的子項目。另外一個開源的ORM框架,能夠說是Apache做爲iBatis以後的取代產品,也是很是優秀的O/R Mapping框架,可是因爲Hibernate 的廣芒太盛,因此並未有普遍的使用,並且因爲OJB的開發文檔不是不少,這也影響了OJB的流行。