JPA從入門(mén)到精通_第1頁(yè)
JPA從入門(mén)到精通_第2頁(yè)
JPA從入門(mén)到精通_第3頁(yè)
JPA從入門(mén)到精通_第4頁(yè)
JPA從入門(mén)到精通_第5頁(yè)
已閱讀5頁(yè),還剩53頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

JPA簡(jiǎn)介

主要內(nèi)容JPA概述使用JPA的步驟實(shí)體JPA的APIJPQL主要內(nèi)容JPA概述使用JPA的步驟實(shí)體JPA的APIJPQLJPA概述JPA是什么JPA的產(chǎn)生為什么要使用JPAJPA和Hibernate的關(guān)系JPA的供應(yīng)商JPA的實(shí)現(xiàn)JPA的優(yōu)勢(shì)JPA的缺點(diǎn)JPA主要的技術(shù)一、JPA概述—JPA是什么JavaPersistenceAPI,用于對(duì)象持久化的API是JavaEE5.0平臺(tái)標(biāo)準(zhǔn)的

ORM規(guī)范,使得應(yīng)用程序以統(tǒng)一的方式訪問(wèn)持久層一、JPA概述—JPA是什么JPA是EJB3EntityBean,是一套從EJB3.0核心標(biāo)準(zhǔn)中分離出來(lái)的獨(dú)立的標(biāo)準(zhǔn)文檔J2EE4規(guī)范中最為人所熟悉的用來(lái)處理數(shù)據(jù)持久的EntityBean,

在JavaEE5中被推到重來(lái),取而代之的是java開(kāi)發(fā)的通用持久化規(guī)范JavaPersistenceAPI1.0,其實(shí)就是完全重新定義了的EntityBean規(guī)范;JPA作為java中負(fù)責(zé)關(guān)系數(shù)據(jù)持久化的組件已經(jīng)完全獨(dú)立出來(lái)成為一個(gè)單獨(dú)的規(guī)范,而不再屬于EnterpriseJavaBean的范疇

(EJB更多的是指Stateless/Statefulsessionbean和MessageDrivenBean)。使用的Java的版本決定了實(shí)際是否可以應(yīng)用JPA。

因?yàn)镴PA是EJB3.0規(guī)范的一部分,而EJB3.0規(guī)范是JavaEE5版本的一部分。如果您未更新到JavaEE5,則無(wú)法使用JPA。

一、JPA概述—JPA是什么提供了以pojo編程模型為持久化對(duì)象的機(jī)制:通過(guò)JDK5.0注解或XML描述對(duì)象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)中,下圖描述了JPA的結(jié)構(gòu):

一、JPA概述—JPA的產(chǎn)生Sun引入新的JPAORM規(guī)范出于兩個(gè)原因:其一,簡(jiǎn)化現(xiàn)有JavaEE和JavaSE應(yīng)用的對(duì)象持久化的開(kāi)發(fā)工作:和實(shí)體Bean相比,不需要配置文件,提供了更好的開(kāi)發(fā)體驗(yàn)不同于EJB3.0,JPA并不是J2EE環(huán)境專(zhuān)用,在J2SE的環(huán)境中也可以使用(不依賴(lài)J2EE容器,是java中的通用API)其二,Sun希望整合ORM技術(shù),統(tǒng)一各種ORM框架的規(guī)范,實(shí)現(xiàn)天下歸一。

(目前Hibernate3.2、TopLink10.1.3以及OpenJpa都提供了JPA的實(shí)現(xiàn))一、JPA概述—為什么要使用JPA一、JPA概述—JPA和Hibernate的關(guān)系JPA是hibernate的一個(gè)抽象或者可以理解為接口(就像JDBC和JDBC驅(qū)動(dòng)的關(guān)系):JPA是規(guī)范:JPA本質(zhì)上就是一種ORM規(guī)范,不是ORM框架——因?yàn)镴PA并未提供ORM實(shí)現(xiàn),它只是制訂了一些規(guī)范,提供了一些編程的API接口,但具體實(shí)現(xiàn)則由用用服務(wù)器廠商來(lái)提供實(shí)現(xiàn)Hibernate是實(shí)現(xiàn):Hibernate除了作為ORM框架之外,它也是一種JPA實(shí)現(xiàn)從功能上來(lái)說(shuō),JPA現(xiàn)在就是Hibernate功能的一個(gè)子集一、JPA概述—JPA的供應(yīng)商

JPA的目標(biāo)之一是制定一個(gè)可以由很多供應(yīng)商實(shí)現(xiàn)的API,目前Hibernate3.2、TopLink10.1.3以及OpenJpa都提供了JPA的實(shí)現(xiàn)HibernateJPA的始作俑者就是Hibernate的作者Hibernate從3.2開(kāi)始,就開(kāi)始兼容JPAOpenJPAOpenJPA是Apache組織提供的開(kāi)源項(xiàng)目TopLinkTopLink以前需要收費(fèi),如今開(kāi)源了;OpenJPA雖然免費(fèi),但功能、性能、普及性等方面更加需要加大力度。一、JPA概述—JPA的實(shí)現(xiàn)JPA做為JavaEE5里面的新成員,跟jdbc一樣就是一接口,具體實(shí)現(xiàn)由服務(wù)器實(shí)現(xiàn)你選擇什么服務(wù)器就基本上決定了用哪個(gè)JPA實(shí)現(xiàn)JBoss就是用hibernate去實(shí)現(xiàn)的weblogic是用OpenJPAOracle是用TopLink一、JPA概述—JPA的優(yōu)勢(shì)標(biāo)準(zhǔn)化提供相同的訪問(wèn)API,這保證了基于JPA開(kāi)發(fā)的企業(yè)應(yīng)用能夠經(jīng)過(guò)少量的修改就能夠在不同的JPA框架下運(yùn)行。越來(lái)越多的提供商期待在不久的將來(lái)提供JPA實(shí)施。對(duì)容器級(jí)特性的支持

JPA框架中支持大數(shù)據(jù)集、事務(wù)、并發(fā)等容器級(jí)事務(wù)簡(jiǎn)單易用,集成方便

JPA的主要目標(biāo)之一就是提供更加簡(jiǎn)單的編程模型,在JPA框架下創(chuàng)建實(shí)體和創(chuàng)建Java類(lèi)一樣簡(jiǎn)單,只需要使用javax.persistence.Entity進(jìn)行注釋?zhuān)籎PA的框架和接口也都非常簡(jiǎn)單,可媲美JDBC的查詢能力

JPA的查詢語(yǔ)言是面向?qū)ο蟮模琂PA定義了獨(dú)特的JPQL,而且能夠支持批量更新和修改、JOIN、GROUPBY、HAVING等通常只有SQL才能夠提供的高級(jí)查詢特性,甚至還能夠支持子查詢。支持面向?qū)ο蟮母呒?jí)特性

JPA中能夠支持面向?qū)ο蟮母呒?jí)特性,如類(lèi)之間的繼承、多態(tài)和類(lèi)之間的復(fù)雜關(guān)系,最大限度的使用面向?qū)ο蟮哪P鸵?、JPA概述—JPA的缺點(diǎn)由于非常新,JPA規(guī)范可能還需要進(jìn)過(guò)重要發(fā)展才會(huì)變得很穩(wěn)定。JPA是一個(gè)規(guī)范而不是一個(gè)產(chǎn)品。

需要提供商提供一個(gè)實(shí)施,才能獲得這些基于標(biāo)準(zhǔn)的API的優(yōu)勢(shì)。JPA是Hibernate、TopLink,JDO等ORM框架真子集,只提供其中最好的功能,如果應(yīng)用程序中需要的功能,但是規(guī)范中沒(méi)有提供的功能,則使用供應(yīng)商特有的API,移植起來(lái)比較麻煩,所以要盡可能地使用JPAAPI。一、JPA概述—JPA包括3方面的技術(shù)ORM映射元數(shù)據(jù):JPA支持XML和JDK5.0注解兩種元數(shù)據(jù)的形式,元數(shù)據(jù)描述對(duì)象和表之間的映射關(guān)系,框架據(jù)此將實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)表中。

JPA的API:用來(lái)操作實(shí)體對(duì)象,執(zhí)行CRUD操作,框架在后臺(tái)替我們完成所有的事情,開(kāi)發(fā)者從繁瑣的JDBC和SQL代碼中解脫出來(lái)。

查詢語(yǔ)言:這是持久化操作中很重要的一個(gè)方面,通過(guò)面向?qū)ο蠖敲嫦驍?shù)據(jù)庫(kù)的查詢語(yǔ)言查詢數(shù)據(jù),避免程序的SQL語(yǔ)句緊密耦合。主要內(nèi)容JPA概述使用JPA的步驟實(shí)體JPA的APIJPQL二、使用JPA持久化對(duì)象的步驟創(chuàng)建persistence.xml,在這個(gè)文件中配置持久化單元(Hibernate中的hibernate.cfg.xml);;需要指定跟哪個(gè)數(shù)據(jù)庫(kù)進(jìn)行交互;需要指定JPA使用哪個(gè)持久化的框架;(因?yàn)樗旧頉](méi)有持久化能力);創(chuàng)建EntityManagerFactory(Hibernate中的SessionFactory);創(chuàng)建EntityManager(實(shí)體管理器)(Hibernate中的Session);創(chuàng)建實(shí)體類(lèi),使用annotation來(lái)描述實(shí)體類(lèi)跟數(shù)據(jù)庫(kù)表之間的一一映射關(guān)系.使用JPAAPI完成數(shù)據(jù)增加、刪除、修改和查詢操作JPA的執(zhí)行過(guò)程persistence.xml持久化單元持久化單元

:persistence-unit數(shù)據(jù)庫(kù)相關(guān)的信息持久化提供者信息(Hibernate、Toplink…)廠商的一些客戶化屬性

<propertyname="hibernate.show_sql"value="true"/>其他可選的一些元數(shù)據(jù)如果使用不同的持久化提供程序,那么需要指定提供程序類(lèi)附加的ORM映射文件附加的ORM映射文件附加實(shí)體的JAR文件一個(gè)持久化單元可以創(chuàng)建一個(gè)EntityManagerFactory持久化提供者PersistenceProvider:持久化提供者JPA只是一套標(biāo)準(zhǔn)的持久化API,它需要通過(guò)一個(gè)ORM框架,才能進(jìn)行持久化,我們把這個(gè)能和JPA集成起來(lái)的ORM框架稱(chēng)為持久化的提供者;每一個(gè)支持ebj3.0JPA的ORM框架必須提供一個(gè)實(shí)現(xiàn)javax.persistence.spi.PersistenceProvider接口的實(shí)現(xiàn)類(lèi),通過(guò)它創(chuàng)建EntityManager對(duì)象使用JPA實(shí)現(xiàn)增加、刪除、修改和查詢操作EntityManagerFactory實(shí)體管理器的工廠,類(lèi)似于Hibernate中的SessionFactory通過(guò)持久化提供者PersistenceProvider創(chuàng)建這個(gè)對(duì)象應(yīng)用程序管理用來(lái)創(chuàng)建EntityManager實(shí)例一個(gè)數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)EntityManagerFactory對(duì)象EntityManager實(shí)體管理器,類(lèi)似于Hibernate的Session由EntityManagerFacotry創(chuàng)建用來(lái)訪問(wèn)持久化上下文中實(shí)體對(duì)象的一個(gè)接口,管理實(shí)體對(duì)象與底層數(shù)據(jù)源之間進(jìn)行O/R映射,包括增刪改查一個(gè)線程一個(gè)EntityManager對(duì)象,EntityManager獲取EntityManager對(duì)象的方式應(yīng)用程序管理EntityManager應(yīng)用程序通過(guò)javax.persistence.EntityManagerFactory的createEntityManager創(chuàng)建EntityManager實(shí)例容器管理EntityManager通過(guò)依賴(lài)注入獲取PersistenceContext:持久化上下文其實(shí)就是JPA的一級(jí)緩存是一系列實(shí)體的管理環(huán)境,實(shí)體對(duì)象集合被EntityManager管理著的,通過(guò)EntityManager和持久化上下文進(jìn)行交互。持久化上下文類(lèi)型應(yīng)用程序管理應(yīng)用程序來(lái)管理所需資源持久化上下文是綁定到當(dāng)前EntityManager容器管理,又分為兩種:和事務(wù)范圍相關(guān)持久化上下文事務(wù)啟動(dòng)就會(huì)創(chuàng)建,事務(wù)結(jié)束也會(huì)結(jié)束;在無(wú)狀態(tài)sessionbean中使用;擴(kuò)展的持久化上下文和有狀態(tài)sessionbean結(jié)合使用,它的生命周期和事務(wù)無(wú)關(guān);當(dāng)Sessionbean對(duì)象創(chuàng)建,持久化上下文就創(chuàng)建;

當(dāng)Sessionbean對(duì)象銷(xiāo)毀,持久化上下文就結(jié)束JPA的使用步驟JPA的使用步驟JPA的使用步驟主要內(nèi)容JPA概述使用JPA的步驟實(shí)體JPA的APIJPQL三、實(shí)體三、實(shí)體三、實(shí)體三、實(shí)體三、實(shí)體—實(shí)體的定義

實(shí)體具備以下的條件:必須使用javax.persistence.Entity注解或者在XML映射文件中有對(duì)應(yīng)的元素;

必須具有一個(gè)不帶參的構(gòu)造函數(shù),

類(lèi)不能聲明為final,

方法和需要持久化的屬性也不能聲明為final;

如果游離狀的實(shí)體對(duì)象需要以值的方式進(jìn)行傳遞,如通Sessionbean的遠(yuǎn)程業(yè)務(wù)接口傳遞,則必須實(shí)現(xiàn)Serializable接口;

需要持久化的屬性,其訪問(wèn)修飾符不能是public,它們必須通過(guò)實(shí)體類(lèi)方法進(jìn)行訪問(wèn)。三、實(shí)體—Annotation—基本注解

基本注解@Entity將對(duì)象標(biāo)注為一個(gè)實(shí)體,表示需要保存到數(shù)據(jù)庫(kù)中默認(rèn)情況下類(lèi)名即為表名,通過(guò)name屬性顯式指定表名@Id對(duì)應(yīng)的屬性是表的主鍵@GeneratedValue主鍵的產(chǎn)生策略,通過(guò)strategy屬性指定;默認(rèn)情況下,JPA自動(dòng)選擇一個(gè)最適合底層數(shù)據(jù)庫(kù)的主鍵生成策略可供選擇的策略IDENTITY:表自增鍵字段(SqlServer對(duì)應(yīng)策略,Oracle不支持這種方式)AUTO:JPA自動(dòng)選擇合適的策略,是默認(rèn)選項(xiàng)(MySql對(duì)應(yīng)策略);SEQUENCE:通過(guò)序列產(chǎn)生主鍵,通過(guò)@SequenceGenerator注解指定序列名(如Oracle的Sequence,MySql不支持這種方式);TABLE:通過(guò)表產(chǎn)生主鍵,使用該策略可以使應(yīng)用更易于數(shù)據(jù)庫(kù)移植。不同的JPA實(shí)現(xiàn)商生成的表名是不同的。三、實(shí)體—Annotation—基本注解

基本注解@EmbeddedId或@IdClass組合關(guān)鍵字@Column屬性對(duì)應(yīng)的表字段三、實(shí)體—Annotation—繼承關(guān)系

繼承關(guān)系:

對(duì)于繼承的實(shí)體,在javax.persistence.InheritanceType定義了3種映射策略SINGLE_TABLE

父子類(lèi)都保存到同一個(gè)表中,通過(guò)字段值進(jìn)行區(qū)分。

JOINED

父子類(lèi)相同的部分保存在同一個(gè)表中,不同的部分分開(kāi)存放,通過(guò)表連接獲取完整數(shù)據(jù)。TABLE_PER_CLASS

每一個(gè)類(lèi)對(duì)應(yīng)自己的表(一般不推薦采用這種方式)。三、實(shí)體—Annotation—關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系:

@OneToOne

@OneToMany

@ManyToOne@ManyToMany

主要內(nèi)容JPA概述使用JPA的步驟實(shí)體JPA的APIJPQL四、JPA的API下面是EntityManager的一些主要的接口方法voidpersist(Objectentity)新實(shí)體實(shí)例將轉(zhuǎn)換為受控狀態(tài)voidremove(Objectentity)刪除某個(gè)實(shí)體對(duì)象,也就是刪除數(shù)據(jù)庫(kù)中某條記錄voidflush()將受控態(tài)的實(shí)體數(shù)據(jù)同步到數(shù)據(jù)庫(kù)中Tmerge(Tentity)游離態(tài)的實(shí)體持久化到數(shù)據(jù)庫(kù)中,并轉(zhuǎn)換為受控態(tài)的實(shí)體Tfind(ClassentityClass,ObjectprimaryKey)以主鍵查詢實(shí)體對(duì)象,entityClass是實(shí)體的類(lèi),primaryKey是主鍵值四、JPA的API--修改四、JPA的API--刪除JPA的生命周期

實(shí)體的狀態(tài)新建態(tài)new

新創(chuàng)建的實(shí)體對(duì)象,尚未擁有持久化主鍵,沒(méi)有和一個(gè)持久化上下文關(guān)聯(lián)起來(lái)受控態(tài)managed

已經(jīng)擁有持久化主鍵并和持久化上下文建立了聯(lián)系游離態(tài)detached

擁有持久化主鍵,但尚未和持久化上下文建立聯(lián)系刪除態(tài)removed擁有持久化主鍵,已經(jīng)和持久化上下文建立聯(lián)系,但已經(jīng)被安排從數(shù)據(jù)庫(kù)中刪除主要內(nèi)容JPA概述使用JPA的步驟實(shí)體JPA的APIJPQL五、

JPQL

JavaPersistenceQueryLanguage(Java持久化查詢語(yǔ)言)是一種可移植的查詢語(yǔ)言,可以被編譯成所有主流數(shù)據(jù)庫(kù)服務(wù)器上的SQLJPQL是面向?qū)ο蟮?,通過(guò)面向?qū)ο蠖敲嫦驍?shù)據(jù)庫(kù)的查詢語(yǔ)言查詢數(shù)據(jù),在Java空間對(duì)類(lèi)和對(duì)象進(jìn)行操作,避免程序的SQL語(yǔ)句緊密耦合使用javax.persistence.Query接口代表一個(gè)查詢實(shí)例五、

JPQL—?jiǎng)?chuàng)建Query實(shí)例

通過(guò)EntityManager來(lái)生成Query實(shí)例:

EntityManager提供的使用JPQL(或原生SQL)創(chuàng)建Query的方法:五、

JPQL—使用Query接口Query接口執(zhí)行數(shù)據(jù)查詢的部分方法:getSingleResult():?jiǎn)我徊樵兘Y(jié)果getResultList():多個(gè)查詢結(jié)果setParameter:QuerysetParameter(intposition,Objectvalue):通過(guò)參數(shù)位置號(hào)綁定查詢語(yǔ)句中的參數(shù)Quer

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論