JPA學習總結(蒐羅的其他前輩們的知識結晶加上自己的一點點心得)

 

JPA技術簡單介紹<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

什麼是JPA?

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

爲什麼要使用JAP?

在說爲什麼要使用JPA之前,我們有必要了解爲什麼要使用ORM技術。

ORM Object-Relation-Mapping,即對象關係影射技術,是對象持久化的核心。ORM是對JDBC的封裝,從而解決了JDBC的各種存在問題:

a) 繁瑣的代碼問題

JDBCAPI編程訪問數據庫,代碼量較大,特別是訪問字段較多的表的時候,代碼顯得繁瑣、累贅,容易出錯。例如:PreparedStatement pstmt=con.prepareStatment("insert into account value(?,?,?,?,?,?,?,?,?)");

ORM則建立了Java對象與數據庫對象之間的影射關係,程序員不需要編寫複雜的SQL語句,直接操作Java對象即可,從而大大降低了代碼量,也使程序員更加專注於業務邏輯的實現。

b) 數據庫對象連接問題

關係數據對象之間,存在各種關係,包括111對多、多對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();
       }

以上程序將向後臺數據庫發送1000SQL語句執行請求,運行效率較低。

採用ORM技術,ORM框架將根據具體數據庫操作需要,會自動延遲向後臺數據庫發送SQL請求,ORM也可以根據實際情況,將數據庫訪問操作合成,儘量減少不必要的數據庫操作請求。

 

    <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

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定義了獨特的JPQLJava Persistence Query Language),JPQLEJB QL的一種擴展,它是針對實體的一種查詢語言,操作對象是實體,而不是關係數據庫的表,而且能夠支持批量更新和修改、JOINGROUP BYHAVING 等通常只有 SQL 才能夠提供的高級查詢特性,甚至還能夠支持子查詢。
5
支持面向對象的高級特性
  JPA 中能夠支持面向對象的高級特性,如類之間的繼承、多態和類之間的複雜關係,這樣的支持能夠讓開發者最大限度的使用面向對象的模型設計企業應用,而不需要自行處理這些特性在關係數據庫的持久化。

怎麼使用JPA?

簡單說來要使用JPA需要網工程裏面導入jar(不同的提供商提供的jar包也不同),並且還要有一個persistence.xml文件來設置持久性單元。

 

如果你打算在你的應用中使用JPA,你就需要使用持久性單元(Persistence Units)。持久性單元具有唯一的名稱,負責定義應用中的一組實體如何進行管理和持久性。在應用中使用persistence.xml文件來設置持久性單元,可以配置多個持久性單元,但每個單元擁有唯一的名稱。

注意persistence.xml文件的位置決定持久性的根(Persistence Root)。持久性的根爲JAR文件或者包含META-INF目錄(前提是persistence.xml位於此)的目錄。一般將這個persistence.xml文件放在src下的
META-INF
中。


持久性單元包含的屬性有:

  • 在該持久性單元範圍(作用域)內的實體類

  • 爲上述實體類提供持久性的持久性提供者(Persistence Provider)或庫

  • 上述實體類的數據源(Data Source)

  • 應用使用的事務類型(Transaction Type)

持久性提供者(Persistence Provider

持久性提供者指的是JPA的實現。持久性提供者是一個能夠爲應用提供持久性對象的的庫。例如Netbeans綁定了TopLink Essentials 作爲持久性提供者,同時TopLink Essentials也是Sun Java System Application Server Platform Edition 9 (Glassfish)的參考實現和默認配置。TopLink Essentials包括toplink-essentials.jartoplink-essentials-agent.jar兩個JAR文件。你可以使用別的持久性提供者例如Hibernate

 

數據源

數據源指的是提供實體存儲的數據庫。數據源必須在服務器中註冊並且使用JNDI名稱指定。如果事務是由容器管理的JTA事務那麼數據源必須是JTA數據源。如果事務是應用負責管理的,數據源根據在IDE中註冊的JDBC數據庫連接指定。

Java SE環境下,數據庫可以通過數據源指定,也可以使用其他方法,取決於持久性提供者的要求。

事務類型

持久性單元指定事務是如何管理的。事務類型取決於目標容器,如果目標容器是Java EE容器,你可以使用容器管理或者應用管理。如果不是這樣的話,你只能使用應用管理。

  • 容器管理的事務(JTA事務)

容器使用Java Transaction API來管理事務。你必須將你的應用部署在Java EE容器中,並且你的數據源必須支持JTA
persistence.xml中事務類型被設置爲JTA.如果你使用Glassfish這個是默認選項。

  • 應用管理的事務(本地資源事務:Resource-Local Transaction

由應用負責事務處理。在persistence.xml文件中,被設置爲RESOUCE_LOCAL

 

一個簡單的persistence.xml配置文件例子:

<?xml version="1.0" encoding="UTF-8"?>

<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

<persistence-unit name="lite_db_pu"                                                                  transaction-type="RESOURCE_LOCAL">

<provider>oracle.toplink.essentials.PersistenceProvider</provider>

 <class>com.e.liteworkflow.entity.Workflow</class>

 <class>com.e.liteworkflow.entity.Activity</class>

 <properties>

   <property name="toplink.jdbc.user" value="sa"/>

   <property name="toplink.jdbc.password" value="E2005"/>

   <property name="toplink.jdbc.url"

       value="jdbc:jtds:sqlserver://10.30.20.69/liteworkflowdb"/>

       <property name="toplink.jdbc.driver"                                               value="net.sourceforge.jtds.jdbc.Driver"/>

   <!--property name="toplink.logging.level" value="FINE"/-->

   <property name="toplink.ddl-generation" value="create-tables"/>

   <property name="toplink.weaving" value="false"/>

 </properties>

</persistence-unit>

<persistence-unit name="lite_derby_pu"                                                           transaction-type="RESOURCE_LOCAL">

       <!— 省略了配置內容 -->

</persistence-unit>

</persistence>

 

對配置文件中一些重要元素和屬性的解釋:

1. 配置文件中可以有多個<persistence-unit></persistence-unit>但是這些persistence-unitname屬性不可以相同;

2. persistence-unittransaction-type標明瞭事務由誰去管理,RESOURCE_LOCAL指本地數據庫管理事務(不支持分佈式事務),而JTA則是由託管的容器來管理事務(支持分佈式事務);

3.<provider></provider>聲明瞭類文件,這個類文件提供初始的factory方法來創建一個EntityManager實例;

4.<class></class>列出應用程序中的實體類的名稱(這裏要有完整的包名和類名);

5.<properties></properties>中的<property/>均是設置連接數據庫的相關信息:

屬性名:toplink.weaving

描述:是否加載實體使用織入,如果對@OneToOne@ManyToOne的關係實體使用惰性加載,則必須使用織入的方式。

可選值:true(默認):織入實體。

false:不織入實體。

static:靜態織入實體,如果運行在不是Java EE 5容器中,或者JDK 不支持代理

            -javaagent:toplink-essentials-agent.jar方式運行時,需要設置此選項。

屬性名:toplink.ddl-generation

描述:指定DDL生成方式,這些值定義在cle.toplink.essentials.ejb.cmp3.EntityManager FactoryProvider類中。

可選值:none(默認):不生成DDL,不自動生成數據庫。

create-tables:只生成不存在的表,不改變原有表結構。

(create-tables屬性值。如果表存在的話,代碼執行結果就向存在的表格中插入記錄,並且生成很多的警告信

息,告訴你存在了那些表)

drop-and-create-tables:刪除原表,重新生成新表。

 

數據源的指定:根據自己的實現和應用服務器的默認行爲,可能需要爲jta-data-source(指定JTA數據源)/non-jta-data-source(指定非JTA數據源)設置提供值。

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