JPA規範及其它持久層框架

 

JPA是一種規範,而hibernate是JPA的一種實現

JPA全稱爲Java Persistence API ,Java持久化API是Sun公司在Java EE 5規範中提出的Java持久化接口。JPA吸取了目前Java持久化技術的優點,旨在規範、簡化Java對象的持久化工作。使用JPA持久化對象,並不是依賴於某一個ORM框架。

 

JPA是目前比較流行的一種ORM技術之一,所以他擁有ORM技術的各種特點,當然他還有自己的一些優勢:

 

1 標準化

  JPA 是 JCP 組織發佈的 Java EE 標準之一,因此任何聲稱符合 JPA 標準的框架都遵循同樣的架構,提供相同的訪問 API,這保證了基於JPA開發的企業應用能夠經過少量的修改就能夠在不同的JPA框架下運行。

2 對容器級特性的支持

  JPA 框架中支持大數據集、事務、併發等容器級事務,這使得 JPA 超越了簡單持久化框架的侷限,在企業應用發揮更大的作用。

3 簡單易用,集成方便

  JPA的主要目標之一就是提供更加簡單的編程模型:在JPA框架下創建實體和創建Java 類一樣簡單,沒有任何的約束和限制,只需要使用 javax.persistence.Entity進行註釋;JPA的框架和接口也都非常簡單,沒有太多特別的規則和設計模式的要求,開發者可以很容易的掌握。JPA基於非侵入式原則設計,因此可以很容易的和其它框架或者容器集成。

4 可媲美JDBC的查詢能力

  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基礎教程:

http://www.yiibai.com/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框架有如下這些產品:

1Enitiy EJBEnitiy EJB實際上也是一種ORM技術,這是一直備受爭議的組件技術。事實上,EJBJava EE的蓬勃發展贏得了極高的聲譽,EJB作爲一種重量級、高花費的ORM技術具有不可比擬的優勢。就其他架構設計來講,依然非常優秀。即使現在十分流行的輕量級Java EE架構,其實質是對經典Java EE架構的模仿——雖然存在些許的改進。EJB3.1也採取了低侵入式的設計,增加了Annotation,也具有極大的吸引力。

2hibernate:目前最流行的開源ORM框架,已經被選作JBoss的持久層解決方案。整個HIbernate項目也一併投入了Jboss的懷抱,而JBoss又加入了RedHat組織,所以現在Hibernate屬於RedHat 的一部分。Hibernate 靈巧的設計、優秀的性能,還有其豐富的文檔都是其風靡全球的重要因素。

3iBatis Apache軟件基金組織的子項目。與其稱它爲一種ORM框架,不如稱它爲一中“SQL Mapping”框架。曾經在J2EE的開發中扮演非常重要的角色,但因爲不支持存粹的面向對象操作,因此現在逐漸地被取代。但是在一些公司,依然佔有一席之地,特別是一些對數據訪問特別靈活的地方,iBatis更加的靈活,它允許開發人員直接編寫SQL語句。

4TopLinkOracle公司的產品,作爲一個遵循OTN協議的商業產品,TopLink 在開發過程中可以自由地下載和使用,但是一旦作爲商業產品被使用,則需要收取費用。由於這一點,TopLink 的市場佔有率不高。

5OBJApache軟件基金組織的子項目。另一個開源的ORM框架,可以說是Apache作爲iBatis之後的取代產品,也是非常優秀的O/R Mapping框架,但是由於Hibernate 的廣芒太盛,所以並未有廣泛的使用,而且由於OJB的開發文檔不是很多,這也影響了OJB的流行。



 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章