JPA入門


JPA是什么

JPA全稱Java Persistence API,是一組用於將數據存入數據庫的類和方法的集合。JPA通過JDK 5.0注解或XML描述對象-關系表的映射關系,並將運行期的實體對象持久化到數據庫中。

JPA Providers

JPA是開源API,各企業經營商Oracle, Redhat, Eclipse等,提供各種有特色的JPA產品,其中包括: Hiberate, Eclipselink, Toplink, Spring Data JPA等等

JPA架構

JPA展示如何將Plain Oriented Java Object(POJO)定義為entity,以及如何管理entity之間的關系。

類級架構

JPA的類級架構包含幾個核心組件

> EntityManagerFactory: 創建和管理多個EntityManager實例
> EntityManager: 接口,管理對象的操作(create, update, delete, Query)
> Entity: 持久化對象,在數據庫中以record存儲
> EntityTransaction: 與EntityManager一對一
> Persistence: 包含獲取EntityManagerFactory實例的靜態方法
> Query: 運營商必須實現的接口,獲取滿足creteria的關系對象(relational object)

ORM

當前許多應用使用關系數據庫存數據。最近,供應商轉向對象數據庫來減少數據維護的壓力。對象關系技術的核心是映射orm.xml文件。
由於xml不要求兼容,我們可以輕松修改數據源。

ORM架構

ORM通過編程的方式將對象類型轉換成關系類型。主要特點是將object映射成數據庫中的數據。在映射的過程中我們必須考慮數據,數據類型和數據之間的關系。

階段一
又名Object data階段,包括POJO類,服務接口和類。它是主要的業務層,包含業務邏輯操作和屬性。比如我們考慮employ數據庫的schema
> Employee POJO類包含屬性:ID, name, salary, 和destination,還有這些屬性的setter和getter方法
> Employee DAO/Service類包含創建employee,查找employee,和刪除employee等服務方法。

階段二
又名Mapping或者persistance階段,包括JPA provider, mapping文件(ORM.xml), JPA Loader, 和Object Grid
> JPA provider: 運營商提供的產品,包括JPA flavor(javax.persistence中)。例如 Eclipselink, Toplink, Hibernate等等。
> Mapping文件: ORM.xml包括POJO類到關系數據庫中數據的映射
> JPA Loader: JPA loader類似加載關系數據的緩存內存。
> Oject Grid: 存儲關系數據的臨時位置。

階段三
關系數據階段,包括和業務邏輯有關的關系數據。在提交之前,修改的數據導以grid格式存在緩存內存中。

以上展示了ORM的如何在三個階段中將數據存入數據庫中。

Mapping.xml

mapping.xml指示JPA vendor如惡化將entity類映射到數據庫表上。

注解

一般XML用於配置特定組建或者定義兩個不同組建直接直接的關系。在我們的case中,我們在寫mapping.xml文件時需要將POJO類的屬性和文件中entity tags對應起來。這需一定的維護開銷。

另一種方案是: 在類定義中,我們可以用注解完成配置。注解用於class, properties, 和方法前。所有JPA的注解定義在javax.persistence包中。

Entity關系
Entity可以看作是關系表,因此entity類之間的關系有:
> @ManyToOne
> @OneToMany
> @OneToOne
> @ManyToMany

@ManyToOne關系
例子:employee和department的關系是多對一。department的key作為employment的外鍵。標注在employee內
生成employee和department兩張表,其中employment包含department的key

@OneToMany關系
TableA與TableB是一對多的關系,那么TableA中的一條記錄對映TableB中0或者多條記錄。比如department和employee的關系。標注在department上
department_employee, department, employee

@OneToOne關系

比如一個employee只屬於一個department。標注方式同@ManyToOne,在employee上。
生成employee和department兩張表,其中employment包含department的key

@ManyToMany關系
比如班級和老師之間的關系。兩邊都需要標注。
生成三張表:teacher_class, teacher, class

Criteria API

Criteria API用來定義query,是JPQA query的另一種選擇。String based JPQL query和JPA criteria based query在性能和效率方面相同。

Criteria Query Structure簡單的例子

EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Entity class> cq = cb.createQuery(Entity.class); Root<Entity> from = cq.from(Entity.class); cq.select(Entity); TypedQuery<Entity> q = em.createQuery(cq); List<Entity> allitems = q.getResultList();

上例展示了創建criteria的基本步驟.

> EntityManager: 創建CriteriaBuilder對象 
> CriteriaQuery: 創建Query對象,屬性可以被修改
> CriteriaQuery.from: 設置query root
> CriteriaQuery.select: 設置結果list類型
> TypedQuery<T>: 准備執行的query,並且指明Query result的類型
> TypedQuery.getResultList: 執行query,返回一組結果,存在list中

Reference

http://www.tutorialspoint.com/jpa/jpa_entity_managers.htm

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM