java EE中JPA介绍
全稱是:Java Persistence API (java 持久化應用接口),是由sun公司帶頭制定的。由于目前有很多java持久層的框架,比如Hibernate、TopLink、OpeanJPA等等。
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)
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”)
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種操作
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最適合關系數據庫,對多態支持不好。具體應用時根據需要取舍。
總結
以上是生活随笔為你收集整理的java EE中JPA介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot用JdbcTempl
- 下一篇: Bad Request: amp;quo