JPA入門教程【轉】

JPA(Java Persistence API,Java持久化API)

一、什麼是JPA
對象關係映射ORM(Object-RelationMapping)是用來將對象和對象之間的關係對應到數據庫中表與表之間的關係的一種模式。ORM框架能夠將Java對象映射到關係數據庫,能夠直接持久化複雜的Java對象。ORM框架的出現,使開發者從數據庫編程中解脫出來,把更多的精力放在了業務模型與業務邏輯上。目前比較流行的ORM框架有Hibernate、iBatis、TopLink等。在JPA規範之前,由於沒有官方的標準,使得各ORM框架之間的API差別很大,使用了某種ORM框架的系統會嚴重受制於該ORM的標準。

二、JPA的宗旨是爲POJO提供持久化標準規範。目前Hibernate3.2、TopLink 10.1.3以及OpenJPA都提供了JPA的實現。其技術主要包括:
1、ORM映射元數據 JPA支持XML和JDK5.0註解兩種元數據的形式,元數據描述對象和表之間的映射關係,框架據此將實體對象持久化到數據庫表中

2、JPA 的API用來操作實體對象,執行CRUD(它是Create創建、Read讀取、Update更新和Delete刪除的縮寫)操作,框架在後臺替我們完成所有的
事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來。
3、查詢語言這是持久化操作中很重要的一個方面,通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序與SQL語句的緊密耦合。

三、JPA與Hibernate的關係:
1、JPA本質上是一種ORM規範,並未提供ORM實現,其具體實現由其他廠商來提供。程序員若使用JPA,仍然需要選擇JPA的實現框架。
Hibernate是一個面向Java環境的對象關係數據庫映射工具,即ORM工具。它對JDBCAPI進行了封裝,負責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操作。同時,實體管理器也負責與持久化上下文(PersistenceContext)進行交互,可以實現對實體不同狀態進行轉換操作等。

JPA入門教程



3、如何獲取EntityManager
(1)、實體管理器要通過實體管理器工廠建立。但是,當使用容器託管的實體管理器(在JavaEE環境中)時,應用不和實體管理器工廠交互

。實體管理器直接通過依賴注入或JNDI獲得,容器負責與實體管理器工廠交互。
(2)、注入實體管理器 可以用@PersitenceContext標註來注入EntityManager,其屬性type指明持久化上下文的作用範圍,默認是

TARNSACTION。若選擇EXTENDED(擴展的方式),可使得多次調用使用同樣的上下文,它的意義在於對有狀態的Bean可以跨事務操作實體;

unitName(可選)用於指定一個持久性單元。
(3)、當使用應用託管的實體管理器時,應用必須使用實體管理器工廠來管理實體管理器和持久化上下文的生命週期。EntityManagerFactory

接口供應用來創建應用管理的實體管理器。EntityManagerFactory的方法都是線程安全的。注入實體管理工廠 在JavaEE容器內,可以用

@PersistenceUnit標註注入或者通過JNDI查找獲得EntityManagerFactory,其unitName屬性(可選)用於指明使用哪個持久性單元。

五、JPA開發步驟:

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對象,將在下面的知識中介紹。


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