JPA(Java Persistence API,Java持久化API)
一、什麼是JPA
物件關係對映ORM(Object-Relation Mapping)是用來將物件和物件之間的關係對應到資料庫中表與表之間的關係的一種模式。ORM框架能夠將Java物件對映到關係資料庫,能夠直接持久化複雜的Java物件。ORM框架的出現,使開發者從資料庫程式設計中解脫出來,把更多的精力放在了業務模型與業務邏輯上。目前比較流行的ORM框架有Hibernate、iBatis、TopLink等。在JPA規範之前,由於沒有官方的標準,使得各ORM框架之間的API差別很大,使用了某種ORM框架的系統會嚴重受制於該ORM的標準。
二、JPA的宗旨是為POJO提供持久化標準規範。目前Hibernate 3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的實現。其技術主要包括:
1、ORM對映元資料 JPA支援XML和JDK 5.0註解兩種元資料的形式,元資料描述物件和表之間的對映關係,框架據此將實體物件持久化到資料庫表中
2、JPA 的API 用來操作實體物件,執行CRUD(它是Create建立、Read讀取、Update更新和Delete刪除的縮寫)操作,框架在後臺替我們完成所有的事情,開發者從繁瑣的JDBC和SQL程式碼中解脫出來。
3、查詢語言這是持久化操作中很重要的一個方面,通過面向物件而非面向資料庫的查詢語言查詢資料,避免程式與SQL語句的緊密耦合。
三、JPA與Hibernate的關係:
1、JPA本質上是一種ORM規範,並未提供ORM實現,其具體實現由其他廠商來提供。程式設計師若使用JPA,仍然需要選擇JPA的實現框架。
Hibernate是一個面向Java環境的物件關係資料庫對映工具,即ORM工具。它對JDBC API進行了封裝,負責Java物件的持久化,在分層的軟體架構中它位於持久化層,封裝了所有資料訪問細節,使業務邏輯層可以專注於實現業務邏輯。Hibernate不僅僅管理Java類到資料庫表的對映,還提供了資料查詢和獲得資料的方法,可以大幅度減少開發時人工使用SQL和JDBC處理資料的時間。
2、Hibernate 3.2以後的版本開始支援JPA,其中,涉及JPA的子專案有三個,它們分別是:
Hibernate Core Hibernate框架的核心實現。
Hibernate Annotations 支援JDK 5.0的註釋。
Hibernate EntityManager 支援JPA的實現。
JPA和Hibernate的關係就像JDBC和JDBC驅動的關係,JPA是規範,Hibernate除了作為ORM框架之外,它也是一種JPA實現。
四、實體與實體管理器
1、實體(Entity)
JPA能夠將普通的Java物件(有時被稱作POJO) 對映到資料庫,這些Java物件被稱作Entity(實體)。
(1)、一個實體的定義符合JavaBean的規範,因此常常稱為實體Bean。實體Bean的每個屬性都定義為私有的,並且有對應的Setter和Getter方法。JPA將實體對映到資料庫有兩種方法,一種是基於xml檔案,一種是基於標註。
(2)、採用標註方法對映的實體Bean,在類的定義中還包含了對映資訊,這些對映資訊都是通過標註表示的。下面是圖書分類的實體Bean。
@Entity
@Table(name = "bs_category")
public class BsCategory implements Serializable {
}
2、實體管理器(EntityManager)
EntityManager是應用程式訪問持久化上下文中的實體的介面,是Java實體物件與資料庫互動的中介。它負責管理一組對應的實體,包括這組實體的CRUD操作。同時,實體管理器也負責與持久化上下文(Persistence Context)進行互動,可以實現對實體不同狀態進行轉換操作等。
3、如何獲取EntityManager
(1)、實體管理器要通過實體管理器工廠建立。但是,當使用容器託管的實體管理器(在Java EE環境中)時,應用不和實體管理器工廠互動
。實體管理器直接通過依賴注入或JNDI獲得,容器負責與實體管理器工廠互動。
(2)、注入實體管理器 可以用@PersitenceContext標註來注入EntityManager,其屬性 type指明持久化上下文的作用範圍,預設是
TARNSACTION。若選擇EXTENDED(擴充套件的方式),可使得多次呼叫使用同樣的上下文,它的意義在於對有狀態的Bean可以跨事務操作實體;
unitName(可選)用於指定一個永續性單元。
(3)、當使用應用託管的實體管理器時,應用必須使用實體管理器工廠來管理實體管理器和持久化上下文的生命週期。EntityManagerFactory
介面供應用來建立應用管理的實體管理器。EntityManagerFactory的方法都是執行緒安全的。注入實體管理工廠 在Java EE容器內,可以用
@PersistenceUnit標註注入或者通過JNDI查詢獲得EntityManagerFactory,其unitName屬性(可選)用於指明使用哪個永續性單元。
五、JPA開發步驟:
使用JPA進行資料操作,基本的步驟如下:
(1)配置伺服器資料來源。
(2)建立永續性單元。
(3)建立實體類。
(4)建立實體管理器。
(5)操作實體。
(6)關閉實體管理器。
1. 持久化實體(建立實體)
將記憶體中的實體物件寫入到資料表中,在表中反應的是新增了一行記錄,對應SQL的insert語句。持久化實體可通過persist()方法。例如:
em.persist(bsCustomer);//em為實體管理器物件,customer為客戶實體物件
2. 修改實體
已持久化的實體,修改後可以通過merge()方法將其重新儲存。例如:
em.merge(bsCustomer);
3.刪除實體
將持久化的實體從資料庫中刪除,可以通過remove()方法。例如:
em.remove(bsCustomer);
4. 根據主鍵查詢實體
通過實體管理器的find()方法或getReference()方法可以根據主鍵查詢實體,與前者不同,後者在沒有找到時不是返回null,而是丟擲異常。例如:
BsCustomer bsCustomer = em.find(BsCustomer.class, custId);
5.重新整理實體
如果當前被管理的實體已經不是資料庫中最新的資料,則可以通過refresh()方法重新整理實體。例如:
em. refresh(bsCustomer);
6.重新整理實體到資料庫
當呼叫persist()、merge()和remove()這些方法時,更新並不會立刻同步到資料庫中,直到容器決定重新整理到資料庫中時才會執行。在預設情況下,容器決定重新整理是在“相關查詢”(除find()和getReference()之外)執行前或事務提交時發生的,如果你需要在事務提交之前將更新重新整理到資料庫中,可呼叫flush()方法,即手動來重新整理資料庫。例如:
em.flush(bsCustomer);
7.設定重新整理模式
如果不手動呼叫重新整理,則只能依賴於容器的自動重新整理。在預設情況下容器是自動重新整理的(模式為FlushModeType.AUTO)。可通過setFlushMode()方法設定重新整理模式。例如:
em.setFlushMode(FlushModeType.COMMIT);
8.分離實體
當處理了大量的實體後,這些實體都會存在於實體管理器中,這將會消耗大量的記憶體,使程式執行變慢。如果要減少消耗,則可以使用clear()方法,將正在被管理的實體從持久化內容中分離出來。例如:
em.clear();
9.執行復雜查詢
要執行復雜查詢,需要利用實體管理器建立Query物件,將在下面的知識中介紹。