技术开发 频道

Java EE 6引入的JPA 2.0四大新特性详解

  【IT168 文档】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;
         ...     }  

  Vehicle实体中的第一对注解@ElementCollection 和 @CollectionTable指定FeatureType值存储在VEH_OPTNS集合表中,第二对注解@ElementCollection 和 @CollectionTable指定ServiceVisit嵌入式对象存储在VEH_SVC集合表中。

  虽然在例子中没有显示,@ElementCollection注解有两个属性:targetClass 和 fetch。targetClass属性指定基础类或嵌入式类的类名,如果字段或属性是使用泛型定义的,那这两个属性是可选的,上面这个例子就是这样。Fetch属性是可选的,它指定集合是延后检索还是立即检索,使用javax.persistence.FetchType常量,值分别用LAZY和EAGER,默认情况下,集合是延后匹配的。

  JPA 2.0中还有其它许多关于对象/关系映射的增强,例如,JPA 2.0支持嵌套式嵌入,关系嵌入和有序列表,也增加了新的注解增强映射功能,通过@Access注解更灵活地支持特定的访问类型,更多用于实体关系的映射选项,如对单向一对多关系的外键映射支持,通过@MapsId注解支持派生身份,支持孤体删除。

0