在項目中我們公司用的持久化語言是JPA,周五為了給同事們詳細的講解JPA的相關知識,我寫了一個大概提綱,和網友一起分享!
JPA(Java Persistence API)作為Java EE 5.0平臺標準的ORM規(guī)范,將得到所有Java
EE服務器的支持。Sun這次吸取了之前EJB規(guī)范慘痛失敗的經歷,在充分吸收現(xiàn)
有ORM框架的基礎上,得到了一個易于使用、伸縮性強的 ORM規(guī)范。從目 前的
開發(fā)社區(qū)的反應上看,JPA受到了極大的支持和贊揚,JPA作為ORM領域標準化
整合者的目標應該不難實現(xiàn)。
JPA由EJB 3.0軟件專家組開發(fā),作為 JSR-220實現(xiàn)的一部分。但它不囿于EJB
3.0,你可以在 Web應用、甚至桌面應用中使用。JPA的宗旨是為POJO提供持久
化標準規(guī)范,由此可見,經過這幾年的實踐探索,能夠脫離容器獨立運行,方便
開發(fā)和測試的理念已經深入人心了。
JPA包括以下 3方面的技術:
(1)ORM映射元數(shù)據,JPA支持XML和JDK 5.0注解兩種元數(shù)據的形式,元數(shù)據描述對象和表之間的映射關系,框架據此將實體對象持久化到數(shù)據庫表中;
(2)、JPA 的API,用來操作實體對象,執(zhí)行CRUD操作,框架在后臺替我們完成所有的事情,開發(fā)者從繁瑣的JDBC和SQL代碼中解脫出來。
(3)、查詢語言,這是持久化操作中很重要的一個方面,通過面向對象而非面向數(shù)據庫的查詢語言查詢數(shù)據,避免程序的SQL語句緊密耦合。
重要的API
JavaEE 5.0中所定義的JPA接口個數(shù)并不多,它們位于javax.persistence和
javax.persistence.spi兩個包中。 javax.persistence包中大部分API都是注解類,除此之
外還包括EntityManager、Query等持久化操作接口。
EntityManager---實體對象由實體管理器進行管理,JPA使用javax.persistence.EntityManager代表實體管理器。
EntityManager的一些主要的接口方法:
(1)void persist(Object entity) -----store()
(2)void remove(Object entity)------remove()
(3)void flush() -----flush()
JPA使用javax.persistence.Query接口代表一個查詢實例,接口方法:
(1)Object getSingleResult():執(zhí)行SELECT查詢語句,并返回一個結果;
(2)List getResultList() :執(zhí)行SELECT查詢語句,并返回多個結果;
(3)Query setParameter(int position, Object value):通過參數(shù)位置號綁定查詢語句中的
參數(shù),如果查詢語句使用了命令參數(shù),則可以使用Query setParameter(String name,
Object value)方法綁定命名參數(shù);
(4)Query setMaxResults(int maxResult):設置返回的最大結果數(shù);
(5)int executeUpdate():如果查詢語句是新增、刪除或更改的語句,通過該方法執(zhí)行
更新操作;
以下是JPA中使用的主要組件:
(1) Persistence: javax.persistence.Persistence類包含靜態(tài)方法用于獲得EntityManagerFactory對象。
(2) EntityManagerFactory: javax.persistence.EntityManagerFactory類是創(chuàng)建EntityManager的工廠類。
(3) EntityManager: javax.persistence.EntityManager是應用中主要使用的接口,它主要用于管理持久對象,也用于創(chuàng)建Query 接口。
(4) Entity。Entity用于封裝持久對象。
(5) EntityTransaction: EntityTransaction 用于封裝事務,javax.persistence.EntityTransaction和EntityManager之間是一對一的關系。
(6) Query: javax.persistence.Query接口用于持久對象的查詢。它支持Java Persistence Query Language (JPQL) 和 Structured Query Language (SQL)。
(7) PersistenceException: JPA異常體系的根是PersistenceException,它繼承于RuntimeException。OpenJPA中拋出的異常都實現(xiàn)了org.apache.openjpa.util.ExceptionInfo接口,用于提供額外的信息。
2、 OpenJPA與JPA的關系
在OpenJPA中大量使用了generic和annotation,因此需要使用1.5以上版本的JDK。
JPA的總體思想和現(xiàn)有 Hibernate、TopLink,JDO等ORM框架大體一致。目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的實現(xiàn)。
3、 OpenJPA在項目中的應用
(1)、引入的jar包有:openjpa-1.2.1.jar、geronimo-jpa_3.0_spec-1.0.jar、geronimo-jta_1.1_spec-1.1.jar;
(2)、為POJO寫映射文件*.orm.xml
(3)、在src下面的META-INF下面的persistence.xml中將POJO的映射文件添加進去
(4)void persist(Object entity) -----store()
void remove(Object entity)------remove()
void flush() -----flush()
getNamedQuery(String queryName)---createNamedQuery()
getNativeQuery(String queryString)--- createNativeQuery()
getDynamicQuery(String queryString)--- createQuery()
getNamedUpdate(String queryName)---createNamedQuery()
4、 推薦資料
Apache OpenJPA 2.0 User's Guide.pdf
ejb-3_0-pfd-spec-persistence.pdf