2011年10月21日星期五

JavaEE_008:JavaEE6 新特性之二:JPA2.0

与JPA1.0最大的不同是,JPA2.0已经从EJB中脱离出来,形成自己的规范:JSR-317。
也就是说关于数据的持久化层的标准,O-R Mapping的标准,完全由JPA2.0来制定,以前的EJB Entity Bean被废除。
JPA2.0的特性如下:

1. 映射功能增强
(1)Collection of embeddables and basic types
不只是JPA entities的Collection。
可以有多层嵌套。
Collection of embeddables 举例:
@Embeddable public class BookReference {
String title;
Float price;
String description;
String isbn;
Integer nbOfPage;
...
}

@Entity public class ListOfGreatBooks {
@ElementCollection
protected Set javaBooks;
...
}

(2)支持“更加灵活”的Maps
Keys或values可以是entities,也可以是embeddables或basic types。

(3)更多的关联关系映射选项
支持map 的单向 one-to-many 关联(JPA1.0 只允许双向 one-to-many关联)。

2. Richer JPQL
提供类似于 SQL 的 CASE, NULLIF,COALESCE 等函数。

3. Criteria API
(1)应广大开发者要求增加了 Criteria API,是一种完全面向对象的查询方式。
(2)与JPQL面向String不同,Criteria API完全面向对象,因此是一种强类型的API。
(3)JPQL在运行时解析语句,所以可能抛出运行时异常,与JPQL不同,Criteria API在编译时就能检查出错误。
(4)Criteria API能够操作the meta-model,访问Persistence Unit。
动态: EntityManager.getMetamodel()。
静态: 每一个entity X 都对应一个metamodel class X_。
(5)CriteriaQuery as a query graph。

面向对象的Criteria API查询方式举例:
EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Book> query =cb.createQuery(Book.class);
Root<Book> book = query.from(Book.class);
query.select(book).where(cb.equal(book.get("description"), ""));

相当于SQL语句:
SELECT b FROM Book b WHERE b.description IS EMPTY

类型安全的Criteria API查询方式举例:
EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Book> query =cb.createQuery(Book.class);
Root<Book> book = query.from(Book.class);
query.select(book).where(cb.isEmpty(book.get(Book_.description)));
这里的Book_类是由JPA2.0 MetaModel自动生成的。

4. 规范了persistence.xml中可以设置的JDBC properties
在persistence.xml 文件中可以设置的属性如下:
javax.persistence.jdbc.driver
javax.persistence.jdbc.url
javax.persistence.jdbc.user
javax.persistence.jdbc.password
javax.persistence.lock.scope
javax.persistence.lock.timeout

5. 二级缓存
(1)entities增加元注释@Cacheable
(2)contain(Class,PK), evict(Class,PK), ...

6. 支持悲观锁
JPA2.0增加支持悲观锁(JPA1.0 只支持乐观锁)。

7. detach()

8. Join, ListJoin, MapJoin

9. Orphan removal functionality
@OneToMany(orphanRemoval=true)

10. BeanValidation integration on lifecycle

参考文献:
1. http://developer.51cto.com/art/200906/130976.htm
2. http://jcp.org/en/jsr/detail?id=317

没有评论: