jpa——學(xué)習(xí)

總結(jié)精煉于http://www.yiibai.com/jpa/jpa_architecture.html
其他不錯(cuò)的文章:介紹Jpa注解(注意Mybatis可沒(méi)有實(shí)現(xiàn)Jpa)http://blog.csdn.net/u014421556/article/details/52040263
JPA(Java持久性API)是存儲(chǔ)業(yè)務(wù)實(shí)體關(guān)聯(lián)的實(shí)體的來(lái)源鲜结。它顯示了如何定義一個(gè)面向普通Java對(duì)象(POJO)作為一個(gè)實(shí)體黍衙,以及如何與管理關(guān)系實(shí)體墓贿。
類疾病的結(jié)構(gòu)圖如下

192R64962-0.png

單元 描述
EntityManagerFactory 這是一個(gè)EntityManager的工廠類。它創(chuàng)建并管理多個(gè)EntityManager實(shí)例册着。
EntityManager 這是一個(gè)接口,它管理的持久化操作的對(duì)象。它的工作原理類似工廠的查詢實(shí)例。
Entity 實(shí)體是持久性對(duì)象是存儲(chǔ)在數(shù)據(jù)庫(kù)中的記錄慨仿。
EntityTransaction 它與EntityManager是一對(duì)一的關(guān)系。對(duì)于每一個(gè)EntityManager纳胧,操作是由EntityTransaction類維護(hù)镰吆。
Persistence 這個(gè)類包含靜態(tài)方法來(lái)獲取EntityManagerFactory實(shí)例。
Query 該接口由每個(gè)JPA供應(yīng)商躲雅,能夠獲得符合標(biāo)準(zhǔn)的關(guān)系對(duì)象鼎姊。
——————
類和接口之間的關(guān)系屬于javax.persistence包骡和。下圖顯示了它們之間的關(guān)系相赁。
192R61c4-1.png

EntityManagerFactory和EntityManager的關(guān)系是1對(duì)多相寇。這是一個(gè)工廠類EntityManager實(shí)例。
EntityManager和EntityTransaction之間的關(guān)系是1對(duì)1钮科。對(duì)于每個(gè)EntityManager操作唤衫,只有一個(gè)EntityTransaction實(shí)例。
EntityManager和Query之間的關(guān)系是1對(duì)多绵脯。查詢數(shù)眾多可以使用一個(gè)EntityManager實(shí)例執(zhí)行佳励。
EntityManager實(shí)體之間的關(guān)系是1對(duì)多。一個(gè)EntityManager實(shí)例可以管理多個(gè)實(shí)體蛆挫。
————————
對(duì)象關(guān)系映射
對(duì)象關(guān)系映射(ORM)簡(jiǎn)要地告訴什么是ORM以及它是如何工作赃承。 ORM是從對(duì)象類型的數(shù)據(jù)隱蔽到關(guān)系型沪猴,反之亦然編程能力魏蔗。
ORM主要特征是映射或綁定一個(gè)目的是它的數(shù)據(jù)庫(kù)中的數(shù)據(jù)。而映射民假,我們要考慮的任何其他表中的數(shù)據(jù)可免,數(shù)據(jù)的類型抓于,并具有自一個(gè)或多個(gè)實(shí)體的關(guān)系。
高級(jí)功能
慣用的持久性:它使您能夠編寫(xiě)使用面向?qū)ο蟮念惓志眯灶悺?br> 高性能:它有許多抓取技術(shù)和充滿希望的鎖定技術(shù)浇借。
可靠的:它是高度穩(wěn)定的捉撮,被很多專業(yè)程序員。
ORM架構(gòu)
在ORM架構(gòu)如下所示妇垢。
194HR940-0.png

在上述體系結(jié)構(gòu)解釋了如何對(duì)象數(shù)據(jù)存儲(chǔ)到關(guān)系數(shù)據(jù)庫(kù)中的三個(gè)階段巾遭。
第1階段
第一階段,命名為對(duì)象數(shù)據(jù)階段修己,包括POJO類恢总,服務(wù)接口和類。它是主要的業(yè)務(wù)組件層睬愤,其具有業(yè)務(wù)邏輯操作和屬性片仿。
例如,讓我們舉個(gè)員工數(shù)據(jù)庫(kù)的架構(gòu)尤辱。
Employee POJO類包含屬性砂豌,如ID,姓名光督,工資和標(biāo)識(shí)阳距。它也包含類似屬性setter和getter方法。
Employee DAO/服務(wù)類包含服務(wù)方法结借,如建立員工筐摘,發(fā)現(xiàn)員工和刪除員工。
第2階段
第二階段,稱為映射或持久性的階段咖熟,包括JPA提供者圃酵,映射文件(orm.xml),JPA裝載器和對(duì)象網(wǎng)格馍管。
JPA提供者:這是一個(gè)包含了JPA(javax.persistence)供應(yīng)的產(chǎn)品郭赐。例如EclipseLink,Toplink确沸,Hibernate等捌锭。
映射文件:映射文件(orm.xml中)包含在關(guān)系數(shù)據(jù)庫(kù)中的一個(gè)POJO類的數(shù)據(jù)和數(shù)據(jù)之間的映射配置。
JPA裝載器:在JPA加載器的工作原理就像一個(gè)高速緩沖存儲(chǔ)器罗捎。它可以加載關(guān)系網(wǎng)格數(shù)據(jù)观谦。它的工作原理類似數(shù)據(jù)庫(kù)的副本與服務(wù)類POJO數(shù)據(jù)(POJO類的屬性)進(jìn)行交互。
對(duì)象網(wǎng)格:它是可存儲(chǔ)的關(guān)系數(shù)據(jù)的副本桨菜,如高速緩沖存儲(chǔ)器的臨時(shí)位置坎匿。對(duì)數(shù)據(jù)庫(kù)的所有查詢首先被實(shí)現(xiàn)在對(duì)象網(wǎng)格的數(shù)據(jù)。只有提交它才會(huì)影響到主數(shù)據(jù)庫(kù)雷激。
第3階段
第三階段是關(guān)系數(shù)據(jù)相關(guān)替蔬。它包含在邏輯上連接到所述業(yè)務(wù)組件的關(guān)系數(shù)據(jù)。如上所討論的屎暇,僅當(dāng)業(yè)務(wù)組件提交該數(shù)據(jù)承桥,它被存儲(chǔ)到數(shù)據(jù)庫(kù)中的物理。在此之前根悼,已修改的數(shù)據(jù)被存儲(chǔ)在高速緩沖存儲(chǔ)器作為一個(gè)網(wǎng)格格式凶异。在獲取數(shù)據(jù)的過(guò)程和存儲(chǔ)數(shù)據(jù)是相同的。
上述三個(gè)階段的編程交互的機(jī)制被稱為對(duì)象關(guān)系映射挤巡。
————————
http://www.yiibai.com/jpa/jpa_orm_components.html#article-start
mapping.xml文件指示JPA的供應(yīng)者來(lái)映射實(shí)體類與數(shù)據(jù)庫(kù)表剩彬。
也可以用注解。
注解 描述
@Entity 聲明類為實(shí)體或表矿卑。
@Table 聲明表名喉恋。
@Basic 指定非約束明確的各個(gè)字段。
@Embedded 指定類或它的值是一個(gè)可嵌入的類的實(shí)例的實(shí)體的屬性母廷。
@Id 指定的類的屬性轻黑,用于識(shí)別(一個(gè)表中的主鍵)。
@GeneratedValue 指定如何標(biāo)識(shí)屬性可以被初始化琴昆,例如自動(dòng)氓鄙,手動(dòng),或從序列表中獲得的值业舍。
@Transient 指定的屬性抖拦,它是不持久的升酣,即,該值永遠(yuǎn)不會(huì)存儲(chǔ)在數(shù)據(jù)庫(kù)中态罪。
@Column 指定持久屬性欄屬性拗踢。
@SequenceGenerator 指定在@GeneratedValue注解中指定的屬性的值。它創(chuàng)建了一個(gè)序列向臀。
@TableGenerator 指定在@GeneratedValue批注指定屬性的值發(fā)生器。它創(chuàng)造了的值生成的表诸狭。
@AccessType 這種類型的注釋用于設(shè)置訪問(wèn)類型券膀。如果設(shè)置@AccessType(FIELD),然后進(jìn)入FIELD明智的驯遇。如果設(shè)置@AccessType(PROPERTY)芹彬,然后進(jìn)入屬性發(fā)生明智的。
@JoinColumn 指定一個(gè)實(shí)體組織或?qū)嶓w的集合叉庐。這是用在多對(duì)一和一對(duì)多關(guān)聯(lián)舒帮。
@UniqueConstraint 指定的字段和用于主要或輔助表的唯一約束。
@ColumnResult 參考使用select子句的SQL查詢中的列名陡叠。
@ManyToMany 定義了連接表之間的多對(duì)多一對(duì)多的關(guān)系玩郊。
@ManyToOne 定義了連接表之間的多對(duì)一的關(guān)系。
@OneToMany 定義了連接表之間存在一個(gè)一對(duì)多的關(guān)系枉阵。
@OneToOne 定義了連接表之間有一個(gè)一對(duì)一的關(guān)系译红。
@NamedQueries 指定命名查詢的列表。
@NamedQuery 指定使用靜態(tài)名稱的查詢兴溜。
Java Bean標(biāo)準(zhǔn)
Java類封裝了實(shí)例的值及其行為為對(duì)象稱為一個(gè)單元侦厚。 Java Bean是一個(gè)臨時(shí)的存儲(chǔ)和可重用的組件或?qū)ο蟆K怯幸粋€(gè)默認(rèn)的構(gòu)造函數(shù)和getter和setter方法來(lái)初始化實(shí)例序列化的類單獨(dú)的屬性拙徽。
Bean約定
bean包含其默認(rèn)構(gòu)造函數(shù)或包含序列化實(shí)例的文件刨沦。因此,一個(gè)bean可以實(shí)例化另一個(gè)bean膘怕。
bean屬性可以被隔離成布爾屬性或者非布爾屬性想诅。
非布爾屬性包含getter和setter方法。
布爾屬性包含setter和方法岛心。
任何字段的getter方法應(yīng)從小字母get(Java方法的公約)開(kāi)始侧蘸,之后使用大寫(xiě)字母開(kāi)頭的字段名。例如鹉梨,字段名為salary讳癌,因此這一字段的getter方法為getSalary()。
任何屬性的setter方法應(yīng)該先從小字母的集合(Java方法公約)開(kāi)始存皂,繼續(xù)以大寫(xiě)字母晌坤,參數(shù)值設(shè)置為字段開(kāi)頭的字段名逢艘。例如,字段名為salary骤菠,因此這一字段的setter方法是setSalary(double sal )它改。
對(duì)于布爾型屬性,方法是檢查它是否是 true 或 false商乎。例如央拖,Boolean屬性為空,則該字段的就是方法isEmpty()鹉戚。
————————————————————
JPA實(shí)體管理器
就是幾個(gè)例子鲜戒。
創(chuàng)建:
public class CreateEmployee
{
public static void main( String[ ] args )
{
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );

Employee employee = new Employee( ); 
employee.setEid( 1201 );
employee.setEname( "Gopal" );
employee.setSalary( 40000 );
employee.setDeg( "Technical Manager" );
entitymanager.persist( employee );
entitymanager.getTransaction( ).commit( );

entitymanager.close( );
emfactory.close( );

}
}
更新Employee:
public class UpdateEmployee
{
public static void main( String[ ] args )
{
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager( );
entitymanager.getTransaction( ).begin( );
Employee employee=entitymanager.
find( Employee.class, 1201 );
//before update
System.out.println( employee );
employee.setSalary( 46000 );
entitymanager.getTransaction( ).commit( );
//after update
System.out.println( employee );
entitymanager.close();
emfactory.close();
}
}

————————————
還有持久化語(yǔ)言:JPQL
public class ScalarandAggregateFunctions
{
public static void main( String[ ] args )
{
EntityManagerFactory emfactory = Persistence.
createEntityManagerFactory( "Eclipselink_JPA" );
EntityManager entitymanager = emfactory.
createEntityManager();
//Scalar function
Query query = entitymanager.
createQuery("Select UPPER(e.ename) from Employee e");
List<String> list=query.getResultList();

for(String e:list)
{
    System.out.println("Employee NAME :"+e);
}
//Aggregate function
Query query1 = entitymanager.
        createQuery("Select MAX(e.salary) from Employee e");
Double result=(Double) query1.getSingleResult();
System.out.println("Max Employee Salary :"+result);

}
}
————
再高級(jí)映射,就是支持繼承抹凳,支持一對(duì)一遏餐、多對(duì)多之類的。
————
還有表中API赢底。就是用方法進(jìn)行CURD操作失都。
————

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市幸冻,隨后出現(xiàn)的幾起案子粹庞,更是在濱河造成了極大的恐慌,老刑警劉巖洽损,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件信粮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡趁啸,警方通過(guò)查閱死者的電腦和手機(jī)强缘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)不傅,“玉大人旅掂,你說(shuō)我怎么就攤上這事》萌ⅲ” “怎么了商虐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)崖疤。 經(jīng)常有香客問(wèn)我秘车,道長(zhǎng),這世上最難降的妖魔是什么劫哼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任叮趴,我火速辦了婚禮,結(jié)果婚禮上权烧,老公的妹妹穿的比我還像新娘眯亦。我一直安慰自己伤溉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布妻率。 她就那樣靜靜地躺著乱顾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宫静。 梳的紋絲不亂的頭發(fā)上走净,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音孤里,去河邊找鬼伏伯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扭粱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播震檩,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼琢蛤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了抛虏?” 一聲冷哼從身側(cè)響起博其,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迂猴,沒(méi)想到半個(gè)月后慕淡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沸毁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年峰髓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片息尺。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡携兵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搂誉,到底是詐尸還是另有隱情徐紧,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布炭懊,位于F島的核電站并级,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侮腹。R本人自食惡果不足惜嘲碧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望父阻。 院中可真熱鬧呀潭,春花似錦钉迷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谐鼎,卻和暖如春舰蟆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狸棍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工身害, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人草戈。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓塌鸯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親唐片。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丙猬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容