1. 程式人生 > >Java JPA知識的理解與總結

Java JPA知識的理解與總結

一、對JPA的理解

JPA的總體思想和現有Hibernate、TopLink,JDO等ORM框架大體一致。總的來說,JPA包括以下3方面的技術:
  1. ORM對映元資料,JPA支援XML和JDK 5.0註解兩種元資料的形式,元資料描述物件和表之間的對映關係,框架據此將實體物件持久化到資料庫表中;
  2. JPA的API,用來操作實體物件,執行CRUD操作,框架在後臺替我們完成所有的事情,開發者從繁瑣的JDBC和SQL程式碼中解脫出來。
  3. 查詢語言,這是持久化操作中很重要的一個方面,通過面向物件而非面向資料庫的查詢語言查詢資料,避免程式的SQL語句緊密耦合。

二、JPA的主要API都定義在javax.persistence包中。與Hibernate對照如下:
————————————————–這裡寫圖片描述

三、實體生命週期

描述了實體物件從建立到受控、從刪除到遊離的狀態變換。對實體的操作主要就是改變實體的狀態。
這裡寫圖片描述
1.New,新建立的實體物件,沒有主鍵(identity)值
2.Managed,物件處於Persistence Context(持久化上下文)中,被EntityManager管理
3.Detached,物件已經遊離到Persistence Context之外,進入Application Domain
4.Removed, 實體物件被刪除
EntityManager提供一系列的方法管理實體物件的生命週期,包括:
1.persist, 將新建立的或已刪除的實體轉變為Managed狀態,資料存入資料庫。
2.remove,刪除受控實體
3.merge,將遊離實體轉變為Managed狀態,資料存入資料庫。
如果使用了事務管理,則事務的commit/rollback也會改變實體的狀態。

四、實體關係對映(ORM)

  1. 基本對映

這裡寫圖片描述
2. ID生成策略
ID對應資料庫表的主鍵,是保證唯一性的重要屬性。JPA提供了以下幾種ID生成策略
(1) GeneratorType.AUTO ,由JPA自動生成
(2) GenerationType.IDENTITY,使用資料庫的自增長欄位,需要資料庫的支援(如SQL Server、MySQL、DB2、Derby等)
(3) GenerationType.SEQUENCE,使用資料庫的序列號,需要資料庫的支援(如Oracle)
(4) GenerationType.TABLE,使用指定的資料庫表記錄ID的增長 需要定義一個TableGenerator,在@GeneratedValue中引用。例如:
@TableGenerator( name=”myGenerator”, table=”GENERATORTABLE”, pkColumnName = “ENTITYNAME”, pkColumnValue=”MyEntity”, valueColumnName = “PKVALUE”, allocationSize=1 )

@GeneratedValue(strategy = GenerationType.TABLE,generator=”myGenerator”)

  1. 關聯關係
    JPA定義了one-to-one、one-to-many、many-to-one、many-to-many 4種關係。
    對於資料庫來說,通常在一個表中記錄對另一個表的外來鍵關聯;對應到實體物件,持有關聯資料的一方稱為owning-side,另一方稱為inverse-side。
    為了程式設計的方便,我們經常會希望在inverse-side也能引用到owning-side的物件,此時就構建了雙向關聯關係。 在雙向關聯中,需要在inverse-side定義mappedBy屬性,以指明在owning-side是哪一個屬性持有的關聯資料。
    對關聯關係對映的要點如下:
    這裡寫圖片描述
    其中 many-to-many關係的owning-side可以使用@JoinTable宣告自定義關聯表,比如Book和Author之間的關聯表:
    @JoinTable(name = “BOOKAUTHOR”, joinColumns = { @JoinColumn(name = “BOOKID”, referencedColumnName = “id”) }, inverseJoinColumns = { @JoinColumn(name = “AUTHORID”, referencedColumnName = “id”) })
    關聯關係還可以定製延遲載入和級聯操作的行為(owning-side和inverse-side可以分別設定):
    通過設定fetch=FetchType.LAZY 或 fetch=FetchType.EAGER來決定關聯物件是延遲載入或立即載入。
    通過設定cascade={options}可以設定級聯操作的行為,其中options可以是以下組合:
    CascadeType.MERGE 級聯更新
    CascadeType.PERSIST 級聯儲存
    CascadeType.REFRESH 級聯重新整理
    CascadeType.REMOVE 級聯刪除
    CascadeType.ALL 級聯上述4種操作
  2. 繼承關係
    JPA通過在父類增加@Inheritance(strategy=InheritanceType.xxx)來宣告繼承關係。A支援3種繼承策略:
    (1) 單表繼承(InheritanceType.SINGLETABLE),所有繼承樹上的類共用一張表,在父類指定(@DiscriminatorColumn)宣告並在每個類指定@DiscriminatorValue來區分型別。
    (2) 類表繼承(InheritanceType.JOINED),父子類共同的部分公用一張表,其餘部分儲存到各自的表,通過join進行關聯。
    (3) 具體表繼承(InheritanceType.TABLEPERCLASS),每個具體類對映到自己的表。
    其中1和2能夠支援多型,但是1需要允許欄位為NULL,2需要多個JOIN關係;3最適合關係資料庫,對多型支援不好。具體應用時根據需要取捨。