【51CTO精選譯文】Java EE 5平台引入了Java持久化API(Java Persistence API,JPA),它為Java EE和Java SE應用程序提供了一個基於POJO的持久化模塊。JPA處理關系數據與Java對象之間的映射,它使對象/關系(O/R)映射標准化,JPA已經被廣泛采用,已經成為事實上的O/R持久化企業標准。
Java EE 6帶來了JPA的最新版本 — JSR 317:Java持久化2.0,JPA 2.0帶來了許多新特性和增強,包括:
1、對象/關系映射增強;
2、Java持久化查詢語言增強;
3、一種新的基於標准的查詢API;
4、支持悲觀鎖定。
對象/關系映射增強
JPA 1.0支持集合的映射,但這些集合只能包含實體,JPA 2.0增加了集合映射的基礎數據類型,如String和Integer,以及嵌入式對象的集合。JPA中的嵌入式對象是一個不能存在於它自身的對象,而是作為父對象的一部分存在,即它的數據不是存在於它自己的表中,而是嵌入在父對象的表中。
JPA 2.0增加了兩個支持新的集合映射的注解:@ElementCollection 和 @CollectionTable。使用@ElementCollection注解指定集合的嵌入式對象,這些集合是獨立存儲在集合表中的,使用@CollectionTable注解指定集合表的詳細信息,如它包含的列。
下面是一個嵌入式類,表示了車輛的訪問服務,它存儲了訪問的日期,描述和費用,此外,車輛可以配備一或多個可選功能,每個功能是FeatureType類型的一個枚舉值。
- public enum FeatureType { AC, CRUISE, PWR, BLUETOOTH, TV, ... }
- @Embeddable
- public class ServiceVisit {
- @Temporal(DATE)
- @Column(name="SVC_DATE")
- Date serviceDate;
- String workDesc;
- int cost;
- }
枚舉值和嵌入式對象可以在一個表示車輛服務歷史的實體中使用,如:
- @Entity
- public class Vehicle {
- @Id int vin;
- @ElementCollection
- @CollectionTable(name="VEH_OPTNS")
- . @Column(name="FEAT")
- Set<FeatureType> optionalFeatures;
- @ElementCollection
- @CollectionTable(name="VEH_SVC")
- @OrderBy("serviceDate")
- List<ServiceVisit> serviceHistory;
- ...
- }
雖然在例子中沒有顯示,@ElementCollection注解有兩個屬性:targetClass 和 fetch。targetClass屬性指定基礎類或嵌入式類的類名,如果字段或屬性是使用泛型定義的,那這兩個屬性是可選的,上面這個例子就是這樣。Fetch屬性是可選的,它指定集合是延後檢索還是立即檢索,使用Javax.persistence.FetchType常量,值分別用LAZY和EAGER,默認情況下,集合是延後匹配的。
JPA 2.0中還有其它許多關於對象/關系映射的增強,例如,JPA 2.0支持嵌套式嵌入,關系嵌入和有序列表,也增加了新的注解增強映射功能,通過@Access注解更靈活地支持特定的訪問類型,更多用於實體關系的映射選項,如對單向一對多關系的外鍵映射支持,通過@MapsId注解支持派生身份,支持孤體刪除。