1.JPA概述
JPA(java Persistence API)作為Java EE 5.0平臺標準的ORM規范,將得到所有Java EE服務器的支持。Sun這次吸取了之前EJB規范慘痛失敗的經歷,在充分吸收現有ORM框架的基礎上,得到了一個易于使用、伸縮性強的ORM規范。從目前的開發社區的反應上看,JPA受到了極大的支持和贊揚,JPA作為ORM領域標準化整合者的目標應該不難實現。
JPA通過JDK 5.0注解或xml描述對象-關系表的映射關系,并將運行期的實體對象持久化到數據庫中,圖 1很好地描述了JPA的結構:

Sun引入新的JPA ORM規范出于兩個原因:其一,簡化現有Java EE和Java SE應用的對象持久化的開發工作;其二,Sun希望整合對ORM技術,實現天下歸一。
JPA由EJB 3.0軟件專家組開發,作為JSR-220實現的一部分。但它不囿于EJB 3.0,你可以在Web應用、甚至桌面應用中使用。JPA的宗旨是為POJO提供持久化標準規范,由此可見,經過這幾年的實踐探索,能夠脫離容器獨立運行,方便開發和測試的理念已經深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的實現。
JPA的總體思想和現有Hibernate、TopLink,JDO等ORM框架大體一致。總的來說,JPA包括以下3方面的技術:
ORM映射元數據,JPA支持XML和JDK 5.0注解兩種元數據的形式,元數據描述對象和表之間的映射關系,框架據此將實體對象持久化到數據庫表中;
JPA 的API,用來操作實體對象,執行CRUD操作,框架在后臺替我們完成所有的事情,開發者從繁瑣的JDBC和SQL代碼中解脫出來。
查詢語言,這是持久化操作中很重要的一個方面,通過面向對象而非面向數據庫的查詢語言查詢數據,避免程序的SQL語句緊密耦合。
2.實體對象
訪問數據庫前,我們總是要設計在應用層承載數據的領域對象(Domain Object),ORM框架將它們持久化到數據庫表中。為了方便后面的講解,我們用論壇應用為例,建立以下的領域對象:

Topic是論壇的主題,而PollTopic是調查性質的論壇主題,它擴展于Topic,一個調查主題擁有多個選項PollOption。這三個領域對象很好地展現了領域對象之間繼續和關聯這兩大核心的關系。這3個領域對象將被映射到數據庫的兩張表中:

其中,Topic及其子類PollTopic將映射到同一張t_topic表中,并用topic_type字段區分兩者。而PollOption映射到t_polloption中。
具有ORM元數據的領域對象稱為實體(Entity),按JPA的規范,實體具備以下的條件:
必須使用javax.persistence.Entity注解或者在XML映射文件中有對應的
必須具有一個不帶參的構造函數,類不能聲明為final,方法和需要持久化的屬性也不能聲明為final;
假如游離狀的實體對象需要以值的方式進行傳遞,如通session bean的遠程業務接口傳遞,則必須實現Serializable接口;
需要持久化的屬性,其訪問修飾符不能是public,它們必須通過實體類方法進行訪問。
進入討論組討論。3.使用注解元數據
基本注解
首先,我們對Topic領域對象進行注解,使其成為一個合格的實體類:
代碼清單1:Topic實體類的注解
package com.baobaotao.domain;
…
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
新聞熱點
疑難解答