java EE中JPA介绍
全稱是:Java Persistence API (java 持久化應(yīng)用接口),是由sun公司帶頭制定的。由于目前有很多java持久層的框架,比如Hibernate、TopLink、OpeanJPA等等。
JPA的總體思想和現(xiàn)有hibernate、TopLink,JDO等ORM框架大體一致。總的來說,JPA包括以下3方面的技術(shù):
1. ORM映射元數(shù)據(jù),JPA支持XML和JDK 5.0注解兩種元數(shù)據(jù)的形式,元數(shù)據(jù)描述對象和表之間的映射關(guān)系,框架據(jù)此將實體對象持久化到數(shù)據(jù)庫表中;
2. JPA的API,用來操作實體對象,執(zhí)行CRUD操作,框架在后臺替我們完成所有的事情,開發(fā)者從繁瑣的JDBC和SQL代碼中解脫出來。
3. 查詢語言,這是持久化操作中很重要的一個方面,通過面向?qū)ο蠖敲嫦驍?shù)據(jù)庫的查詢語言查詢數(shù)據(jù),避免程序的SQL語句緊密耦合。
二、JPA的主要API都定義在javax.persistence包中。與Hibernate對照如下:
————————————————–
三、實體生命周期
描述了實體對象從創(chuàng)建到受控、從刪除到游離的狀態(tài)變換。對實體的操作主要就是改變實體的狀態(tài)。
1.New,新創(chuàng)建的實體對象,沒有主鍵(identity)值
2.Managed,對象處于Persistence Context(持久化上下文)中,被EntityManager管理
3.Detached,對象已經(jīng)游離到Persistence Context之外,進入Application Domain
4.Removed, 實體對象被刪除
EntityManager提供一系列的方法管理實體對象的生命周期,包括:
1.persist, 將新創(chuàng)建的或已刪除的實體轉(zhuǎn)變?yōu)镸anaged狀態(tài),數(shù)據(jù)存入數(shù)據(jù)庫。
2.remove,刪除受控實體
3.merge,將游離實體轉(zhuǎn)變?yōu)镸anaged狀態(tài),數(shù)據(jù)存入數(shù)據(jù)庫。
如果使用了事務(wù)管理,則事務(wù)的commit/rollback也會改變實體的狀態(tài)。
四、實體關(guān)系映射(ORM)
2. ID生成策略
ID對應(yīng)數(shù)據(jù)庫表的主鍵,是保證唯一性的重要屬性。JPA提供了以下幾種ID生成策略
(1) GeneratorType.AUTO ,由JPA自動生成
(2) GenerationType.IDENTITY,使用數(shù)據(jù)庫的自增長字段,需要數(shù)據(jù)庫的支持(如SQL Server、MySQL、DB2、Derby等)
(3) GenerationType.SEQUENCE,使用數(shù)據(jù)庫的序列號,需要數(shù)據(jù)庫的支持(如Oracle)
(4) GenerationType.TABLE,使用指定的數(shù)據(jù)庫表記錄ID的增長 需要定義一個TableGenerator,在@GeneratedValue中引用。例如:
@TableGenerator( name=”myGenerator”, table=”GENERATORTABLE”, pkColumnName = “ENTITYNAME”, pkColumnValue=”MyEntity”, valueColumnName = “PKVALUE”, allocationSize=1 )
@GeneratedValue(strategy = GenerationType.TABLE,generator=”myGenerator”)
JPA定義了one-to-one、one-to-many、many-to-one、many-to-many 4種關(guān)系。
對于數(shù)據(jù)庫來說,通常在一個表中記錄對另一個表的外鍵關(guān)聯(lián);對應(yīng)到實體對象,持有關(guān)聯(lián)數(shù)據(jù)的一方稱為owning-side,另一方稱為inverse-side。
為了編程的方便,我們經(jīng)常會希望在inverse-side也能引用到owning-side的對象,此時就構(gòu)建了雙向關(guān)聯(lián)關(guān)系。 在雙向關(guān)聯(lián)中,需要在inverse-side定義mappedBy屬性,以指明在owning-side是哪一個屬性持有的關(guān)聯(lián)數(shù)據(jù)。
對關(guān)聯(lián)關(guān)系映射的要點如下:
其中 many-to-many關(guān)系的owning-side可以使用@JoinTable聲明自定義關(guān)聯(lián)表,比如Book和Author之間的關(guān)聯(lián)表:
@JoinTable(name = “BOOKAUTHOR”, joinColumns = { @JoinColumn(name = “BOOKID”, referencedColumnName = “id”) }, inverseJoinColumns = { @JoinColumn(name = “AUTHORID”, referencedColumnName = “id”) })
關(guān)聯(lián)關(guān)系還可以定制延遲加載和級聯(lián)操作的行為(owning-side和inverse-side可以分別設(shè)置):
通過設(shè)置fetch=FetchType.LAZY 或 fetch=FetchType.EAGER來決定關(guān)聯(lián)對象是延遲加載或立即加載。
通過設(shè)置cascade={options}可以設(shè)置級聯(lián)操作的行為,其中options可以是以下組合:
CascadeType.MERGE 級聯(lián)更新
CascadeType.PERSIST 級聯(lián)保存
CascadeType.REFRESH 級聯(lián)刷新
CascadeType.REMOVE 級聯(lián)刪除
CascadeType.ALL 級聯(lián)上述4種操作
JPA通過在父類增加@Inheritance(strategy=InheritanceType.xxx)來聲明繼承關(guān)系。A支持3種繼承策略:
(1) 單表繼承(InheritanceType.SINGLETABLE),所有繼承樹上的類共用一張表,在父類指定(@DiscriminatorColumn)聲明并在每個類指定@DiscriminatorValue來區(qū)分類型。
(2) 類表繼承(InheritanceType.JOINED),父子類共同的部分公用一張表,其余部分保存到各自的表,通過join進行關(guān)聯(lián)。
(3) 具體表繼承(InheritanceType.TABLEPERCLASS),每個具體類映射到自己的表。
其中1和2能夠支持多態(tài),但是1需要允許字段為NULL,2需要多個JOIN關(guān)系;3最適合關(guān)系數(shù)據(jù)庫,對多態(tài)支持不好。具體應(yīng)用時根據(jù)需要取舍。
總結(jié)
以上是生活随笔為你收集整理的java EE中JPA介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot用JdbcTempl
- 下一篇: Bad Request: amp;quo