版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、 Hibernate in Action學(xué)習(xí)筆記 2015年 3月 1日目錄Q1.面向?qū)ο髴?yīng)用程序中的持久化問題11.1 范式不匹配11.2 粒度問題11.3 子類型問題11.4 同一性問題11.5 與關(guān)聯(lián)相關(guān)的問題11.6 數(shù)據(jù)訪問方式的問題1Q2.如何解決這些持久化問題22.1 為什么不使用分層架構(gòu),用DAO層解決。22.2 為什么不使用Java序列化22.3 為什么不使用面向?qū)ο髷?shù)據(jù)庫系統(tǒng)22.4 為什么不用XML持久化22.5 使用ORM2Q3.什么是ORM,包括哪些內(nèi)容?3Q4.ORM質(zhì)量等級3Q5.一般的ORM 問題3Q6.HIBERNATE 自由的開發(fā)過程4Q7.HELLO HI
2、BERNATE4IQ1. 面向?qū)ο髴?yīng)用程序中的持久化問題1.1 范式不匹配在電子商務(wù)系統(tǒng)中,用戶與賬單的關(guān)系為一對多關(guān)系。l 面向?qū)ο髸r設(shè)計為一個用戶類與一個賬單類??梢詾橛脩纛愄砑蛹蠈傩裕现写鎯~單),也可以為賬單類添加用戶屬性。但數(shù)據(jù)庫表只能通過賬單的外鍵來實現(xiàn)。l 假如用戶信息中含有地址(國家、地區(qū)、省)等。面向?qū)ο髸r一般會封裝為一個街道類,在用戶類中持有街道類的屬性解決。而數(shù)據(jù)庫表中則不需要存在一個地址表。1.2 粒度問題這里粒度是指正在使用的類型的相對大小。面向?qū)ο笤试S我們無限的擴展類型,而SQL標(biāo)準(zhǔn)支持用戶定義的數(shù)據(jù)類型卻少的可憐。面向?qū)ο笤试S對象的嵌套組合,而數(shù)據(jù)庫表只有兩
3、種粒度:表和列。1.3 子類型問題由于繼承帶來的問題。1.4 同一性問題Java中同一性通過 a = b 和 equals()檢查,數(shù)據(jù)庫通過外鍵檢查。這樣通常需要一個業(yè)務(wù)無關(guān)的代理鍵(UUID)來解決。同一性對系統(tǒng)如何處理高速緩存和事務(wù)密切相關(guān)。1.5 與關(guān)聯(lián)相關(guān)的問題面向?qū)ο罄脤ο笠帽硎娟P(guān)聯(lián);但是在關(guān)系數(shù)據(jù)庫中使用外鍵。對象引用由固有的方向性,而外鍵沒有(可以通過表的聯(lián)結(jié)和投影創(chuàng)建任意關(guān)聯(lián))1.6 數(shù)據(jù)訪問方式的問題Java中可以使用aUser.getDetails().getAccountNumber()。而數(shù)據(jù)庫必須考慮性能,而進行連結(jié)查詢。也就是在你遍歷對象網(wǎng)絡(luò)之前要構(gòu)建有效的連
4、結(jié)查詢!另一方面:懶加載機制總是期望在使用時在獲得對象。但會產(chǎn)生N+1問題:如默認(rèn)情況下,當(dāng)Hibernate從數(shù)據(jù)庫中加載Customer對象時,會同時加載所有關(guān)聯(lián)的 Order對象。以Customer和Order類為例,假定ORDERS表的CUSTOMER_ID外鍵允許為null以下Session的find()方法用于到數(shù)據(jù)庫中檢索所有的Customer對象: List customerLists=session.find("from Customer as c"); 運行以上find()方法時,Hibernate將先查詢CUSTOMERS表中所有的
5、記錄,然后根據(jù)每條記錄的ID,到ORDERS表中查詢有參照關(guān)系的記錄,Hibernate將依次執(zhí)行以下select語句: select * from CUSTOMERS; select * from ORDERS where CUSTOMER_ID=1; select * from ORDERS where CUSTOMER_ID=2; select * from ORDERS where CUSTOMER_ID=3; select * from ORDERS where CUSTOMER_ID=4; Q2. 如何解決這些持久化問題2
6、.1 為什么不使用分層架構(gòu),用DAO層解決。DAO是個好模式,甚至經(jīng)常推薦與ORM一起使用,然而,給每個領(lǐng)域模型類編寫持久化代碼的工作量非常大,特別當(dāng)支持多個SQL方言的時候。為什么不實現(xiàn)個簡單映射框架呢?因為有Hibernate。(80000行代碼,25000行測試代碼)。2.2 為什么不使用Java序列化序列化之后的關(guān)聯(lián)對象網(wǎng)絡(luò)只能被當(dāng)做一個整體訪問:沒有反序列化整個流,就不可能從流中獲取任何數(shù)據(jù)。(在依賴序列化的網(wǎng)絡(luò)傳輸中,要考慮此問題)2.3 為什么不使用面向?qū)ο髷?shù)據(jù)庫系統(tǒng)面向?qū)ο髷?shù)據(jù)庫系統(tǒng)沒有流行起來。2.4 為什么不用XML持久化XML是序列化得一個變體,同時你可能遭受對象/層次結(jié)
7、構(gòu)不匹配的危險。2.5 使用ORM提高生產(chǎn)力提高可維護性性能損耗供應(yīng)商獨立性實現(xiàn)JPA標(biāo)準(zhǔn)Q3. 什么是ORM,包括哪些內(nèi)容?ORM就是利用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),自動(且透明)的把Java應(yīng)用程序中的對象持久化到關(guān)系數(shù)據(jù)庫中的表。本質(zhì)是:把數(shù)據(jù)從一種表示法(可逆)轉(zhuǎn)換為另一種表示法進行工作。ORM解決方案包含下面的4個部分:l 在持久化類的對象上執(zhí)行基本的CRUD操作的一個API ;l 用于指定引用類或者類屬性的查詢的一種語言或者APIl 用于指定映射元數(shù)據(jù)的一種工具:l 用于實現(xiàn)ORM的一項技術(shù),與事務(wù)對象交互,執(zhí)行臟檢查( dirty checking ) 、延遲關(guān)聯(lián)抓以及其他
8、優(yōu)化功能。Q4. ORM質(zhì)量等級純關(guān)系整個應(yīng)閘程序(包括用戶界面)都圍繞著關(guān)系模型和基于SQL的關(guān)系操作而設(shè)計輕量對象映射實體被表示為手工映射到關(guān)系表的類。使用眾所周知的設(shè)計模式,把手工編碼的SQL/JDBC從業(yè)務(wù)邏輯中隱藏起來。中等對象映射這種應(yīng)用程序圍繞對象模型而設(shè)計。SQL使用一個代碼生成的工具在創(chuàng)建時產(chǎn)生,或者通過框架代碼在運行時產(chǎn)生。完全對象映射完全的對象映射支持完善的對象模型: 組合、繼承、多態(tài)和可達的持久化。Q5. 一般的ORM 問題l 持久化類看起來什么樣?持久化工具有多透明?l 映射元數(shù)據(jù)如何定義?l 對象同一性和等同性如何與數(shù)據(jù)庫(主鍵同一柱相關(guān)?l 應(yīng)該如何映射類繼承層次
9、結(jié)構(gòu)?l 持久化邏輯如何在運行時與業(yè)務(wù)領(lǐng)域的對象文互?l 什么是持久化對象的生命周期?l 提供什么工具用來排序、搜索和統(tǒng)計?l 如何利用關(guān)聯(lián)有效地獲取數(shù)據(jù)?Q6. Hibernate EJB3和JPA6.1 理解標(biāo)準(zhǔn)新的EJB 3.0規(guī)范有兒個部分給會話 bean 消息驅(qū)動 bean 以及部署規(guī)則等,定義新的EJB編程模型,規(guī)范的第二部分專門處理持久化實體、ORM 元數(shù)據(jù)、持久化管理器接口和查詢語言部分被稱作JPA。新標(biāo)準(zhǔn)中設(shè)計了兩條重要的原則: 1、JPA引擎應(yīng)該是可插拔的。2、JPA引擎應(yīng)該能夠在EJB3.0(或者任何其他)運行時環(huán)境之外運行。Hibernate實現(xiàn)了Java Persis
10、tence。6.1.1 HibernateCore它是持久化的基礎(chǔ)服務(wù),帶有原生的API和它存儲XML文件中的映射元數(shù)據(jù)。它有 種查詢語稱作HQL (與 SQL 幾乎相同),以及用Criteria Example查詢的可編硬查詢接口。6.1.2 Hibernate AnnotationsJPA規(guī)范定義ORM元數(shù)據(jù)語法和語義,主要機制為 JDK 5.0注解Hibernate annot ations 般來說是實現(xiàn)JPA標(biāo)準(zhǔn)的組基礎(chǔ)注解,它們也是更高級的和更奇異的 Hibern ate 映射和調(diào)優(yōu)所需的 組擴展注解。6.1.3 Hibernate EntityManagerJPA范也定義編程接口、
11、持久化對象的生命周期規(guī)則和查詢特。JPA這部分的 Hibemat實現(xiàn)可被用作 Hibernate EntyManage。Hibernate EntityManger 是對提供JPA就容性的 Hibemate Core個小包裝。Q7. Hibernate 自由的開發(fā)過程我們先從總體上看看可用的工共、用作源輸入的制品,以及生成的輸出。圖2-1展現(xiàn)了Ant的各種導(dǎo)入和導(dǎo)出任務(wù),所有功能對Eclipse的Hibemate Tools插件都可用.閱讀本意時請參照這Q8. Hello Hibernate/First unit of workSession session = HibernateUtil.g
12、etSessionFactory().openSession();Transaction tx = session.beginTransaction();Foo foo = new Foo();Long fooId = (Long)session.save(foo);mit();session.close();/second unit of workSession newSession = HibernateUtil.getSessionFactory().openSession();Transaction newTransaction = session.beginTransaction()
13、;List<Foo> foos = newSession.createQuery(“from Foo”).list();newTmit();newSession.close();/third unit of workSession thirdSession = HibernateUtil.getSessionFactory().openSession();Transaction thirdTransaction = session.beginTransaction();Foo foo thirdSession.get(Foo.class,fooid);foo.setOnePrope
14、rty(“some value”)thirdTmit();/臟檢查自動執(zhí)行更新thirdSession.close();HibernateUtil.shutdown();調(diào)用Hibernate Session、Transaction和Query接口訪問數(shù)據(jù)庫:Session (會話)Hibernate Session集多種功能于一身。它是個單線程、非共享的對象,表示使用數(shù)據(jù)庫的一個特定工作單元。它有持久化管理器API,調(diào)用它來加載和存儲對象。(Session的內(nèi)部由一列SQL語句組成,這些話句要與數(shù)據(jù)庫在某個時點上進行同步,且托管持久化實例的一個映像由Session監(jiān)控.)Transactio
15、n (事務(wù))這個Hibernate API可以用來編程式地設(shè)置事務(wù)范圍, 但它是可選的(事務(wù)范圍不是可選的)。其他的選擇還有JDBC事務(wù)劃分、JTA接口,或者帶有EJB的容器托管事務(wù)。Query (查詢)數(shù)據(jù)庫查詢可以寫進Hibernate自己的面向?qū)ο蟮牟樵冋Z言( HQL ) 或者簡單的SQL中。這個接口允許你創(chuàng)建查詢、在查詢中綁定參數(shù)給占優(yōu)符,并以各種方式執(zhí)行查詢。Q9. Hibernate配置SessionFactory通過Configuration類提供配置信息。Configuration默認(rèn)(可通過Configuration的構(gòu)造方法改變)讀取在ClassPath根目錄下搜索hibe
16、perties所有的Hibernate配置可以再org.hibernate.cfg.Environment中找到。Q10. 數(shù)據(jù)庫連接池連接地在非托管的應(yīng)用程序運行時環(huán)境中的角色(即不要任何應(yīng)用程序服務(wù)器)。使用Hibernate,這個圖就變了: 它充當(dāng)JDBC連接池的一個客戶端程序,如圖2-3所示。應(yīng)用程序代碼給持久化操作使用Hibemate 的Session和Query API ,它(可能)用Hibernate的Transaction API管理數(shù)據(jù)庫事務(wù)。Q11. 監(jiān)控HibernateStatistics stats =HibernateUtil . getSessi
17、onFactory().getStatistics();stats.setStatisticsEnabl ed (true) ;stats.getSessionOpenCount ( ) ;stats.logSummary();EntityStatistics itemStats = stats .getEntityStatistics(.auction .model.Item.) ;itemStats .getFetchCount();統(tǒng)計接口中,Statistics用于全局的信息,EntityStatistics用于有關(guān)一個特定實體的信息, CollectionStatistics用于一儼
18、將定的集合任務(wù),QueryStatistics用于SQL和HQL查詢,SecondLevelCacheStatistics用于詳細的關(guān)于可選的二級數(shù)據(jù)高速緩存中的一個特定區(qū)域的運行時信息。一種方便的方法是logSummary () ,它通過單個調(diào)用把一個完整的摘要打印到控制臺.如果想要通過配置來啟用統(tǒng)計綿合,并且不用編程,就設(shè)置hibernate.generate_statistics配置屬性為true。有關(guān)各種統(tǒng)計稅取方法的更多信息請見API文擋。Q12. JPA Hello World12.1 使用注解標(biāo)注使用javax.persistence.*中的注解Entity Table Id G
19、eneratedValue Column ManyToOne注解標(biāo)注實體。12.2 構(gòu)鍵Persistence unitSessionFactory在hibernate應(yīng)用程序中表示一個特定的邏輯數(shù)據(jù)存儲配置. EntityManagerFactory JPA應(yīng)用程序中扮演著同樣的角色,你用配置文件或者在應(yīng)用程序代碼中配置EtityManager Factory (EMF) ,就像配置 SessionFactory一樣。EMF的配置,與一組映射元數(shù)據(jù)(通常是被注解的類)一起,被稱作持久化單元( persistence unit).編寫persistence.xml提供必要的配置參數(shù),并放入到M
20、ETA-INF目錄下。persistence.xml包括指定JPA的實現(xiàn)產(chǎn)品(hibernate),以及hibernate的各種屬性。12.3 使用JPA編程接口l javax.persistence.Persistence給Entity ManagerFactory的創(chuàng)建提供一種靜態(tài)方法的一個啟動類。l javax.persistence.EntityManagerFactory等同于Hibemate SessionFactory這個運行時對象代表個特定的持久化單元它是錢安全的,通常被當(dāng)作sìngleton) 處理,并給EntityManage實例的創(chuàng)建提供方法。l javax.p
21、ersistence.EntityManager等同于Hibernate Session。這個單線程、非共享的對象表示數(shù)據(jù)訪問的個特定工作單元。它提供方法去管理實例的命周期創(chuàng)建Query實例l javax.persistence.Query等同于Hibemate Query個對象是一種特定的 JPA語言或者原生的SQL查詢表示法,它允許參數(shù)安全綁定,并給查詢的執(zhí)行提供各種各樣的方法。l javax.persistence.EntityTransaction等同于Hibernate Transaction,在JavaSE 環(huán)境中用于RESOURCE_LOCAL事務(wù)的劃分。在Java EE中,依賴
22、JPA標(biāo)準(zhǔn)的 javax.transaction.UserTransaction接口進行編程式的事務(wù)劃分。/ Start EntityManagerFactoryEntityManagerFactory emf =Persistence.createEntityManagerFactory("helloworld");/ First unit of workEntityManager em = emf.createEntityManager();EntityTransaction tx = em.getTransaction();tx.begin();Message mes
23、sage = new Message("Hello World");em.persist(message);mit();em.close();/ Second unit of workEntityManager newEm = emf.createEntityManager();EntityTransaction newTx = newEm.getTransaction();newTx.begin();List messages = newEm.createQuery("select m from Message m order by m.text asc&quo
24、t;).getResultList();System.out.println( messages.size() + " message(s) found" );for (Object m : messages) Message loadedMsg = (Message) m;System.out.println(loadedMsg.getText();newTmit();newEm.close();/ Shutting down the applicationemf.close();Q13. 與Java EE整合Hibemate能夠與JavaEE容器整合的三大關(guān)注點在:JT
25、A、JNDI、JMX。JTA允許Hi bernate參與托管資源(數(shù)據(jù)庫連接)中的事務(wù)。并且能夠把自身當(dāng)作一項服務(wù)綁定到JNDI上。最后,Hibernate可以通過JMX被部署,然后通過JMX容器被當(dāng)作服務(wù)來管理,并且使用標(biāo)準(zhǔn)的JMX戶端程序在運行時被監(jiān)控。13.1 與JTA整合JTA是Java企業(yè)應(yīng)用中事務(wù)控制的標(biāo)準(zhǔn)服務(wù)接口。包括于事務(wù)劃分的UserTransaction API和用于參與事務(wù)生命周期中的 TransactionManager API。事務(wù)管理然能夠協(xié)調(diào)跨資源的單個事務(wù)一。JTA 事務(wù)服務(wù)由所有Java EE應(yīng)用程序服務(wù)器提供。需要在配置sessionFactory的hibe
26、rnate.transaction.factory_class屬性為JTATransactionFactory。13.2 JNDI綁定的SessionFactorySessionFactory 應(yīng)該如何儲,以及它在應(yīng)用程序代碼中應(yīng)該如何訪問?一般的做法是編 寫一個在靜態(tài)字段中存放SessionFactory的HibernateUtil類,并提供靜態(tài)的getSessionFactory()方法。然而,如果在個支持JNDI的部署應(yīng)用程序,Hibrnate可以把SessionFactory綁定到JNDI.你需要時可以到那里查找。hibernage.session_factory_narne屬性設(shè)且為
27、JNDI節(jié)點節(jié)點的名稱,Hibemate 的Se ssionFactory就會自動把自身綁定到 JNDI。13.3 JMX服務(wù)部署Java管理擴展(Java Management Extension. JMX).JMX是關(guān)子系統(tǒng)組件管理或者系統(tǒng)服務(wù)管理的。Hibernage可以作為一項托管的JMX服務(wù),被其他的服務(wù)依賴和使用。Q14. Hiberante Core與JPA對照表 第三章 領(lǐng)域模型和持久化Q15. 領(lǐng)域模型15.1 分析領(lǐng)域模型按照面向?qū)ο蟮姆绞娇紤]:抽象、封裝、多態(tài)、繼承按照數(shù)據(jù)庫模式考慮:主、子表,約束等。兩者有較大差別。例如:報銷單報銷明細。15.2 實現(xiàn)領(lǐng)域模型領(lǐng)域模型分
28、析結(jié)束后,還必須處理幾個經(jīng)典問題:如何把業(yè)務(wù)關(guān)注點與橫切點(例如事務(wù)和持久化)分離?你需要自動的還是透明的持久化?必須使用特定的編程模型來實現(xiàn)這點嗎?15.2.1 橫切關(guān)注分離1、 EJB個托管的組件EJB容器內(nèi)部執(zhí)行容器攔截別bean的調(diào)用并執(zhí)行它自己的功能。這種方法允許容器以一種普遍方式實現(xiàn)預(yù)設(shè)的橫切關(guān)注點安全性、并發(fā)性、持久化、事務(wù)和遠程。2、 使用Spring的AOP事務(wù)管理機制來處理以上問題。15.2.2 透明和自動持久化透明詞,意味著領(lǐng)域模型的持久化類和持久化邏輯之間一個完整的關(guān)注點分離,在這里持久化類不知道且不依賴于持久化機制。自動一詞是指讓你不用處理低級機械化細節(jié)的一種持久化解
29、決方案。體現(xiàn)在:Hibernate的實體使用POJO;Hibernate使用很少的持久化接口Session、Query.15.2.3 編寫POJO并制定元數(shù)據(jù)15.3 創(chuàng)建動態(tài)的應(yīng)用程序除最基本的POJO來表示實體外,Hibernate還允許通過Map和Dom4j來表示實體。第四章 映射持久化類Q16. 理解實體和值類型16.1 細粒度的領(lǐng)域模型Hibernate主要目標(biāo)是支持細粒度的領(lǐng)域模型,粗略地說,細粒度意味著類比表更多。例如:用戶可能既有付款地址又有家庭住址。16.2 識別實體和值類型考慮如下因素識別值對象:1、是否有一個依賴的生命周期,如果此對象依賴于另一個對象的生滅,就認(rèn)為他是有一個依賴的生命周期的兩個對象是聚合關(guān)系。2、是否需要它們自己的同一性(java中體現(xiàn)為 = 和 equals() 方法,數(shù)據(jù)庫中體現(xiàn)為主鍵是否相等),就是說你的代碼中會不會去比較兩個對象是否具有同一性,3、是否需要支持共享引用。如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年小學(xué)班主任例會制度范文(二篇)
- 2024年國際專利技術(shù)許可合同例文(三篇)
- 2024年實習(xí)期個人工作總結(jié)參考模板(七篇)
- 2024年員工試用期工作總結(jié)例文(三篇)
- 2024年基本公共衛(wèi)生工作問責(zé)制度范例(二篇)
- 2024年學(xué)生會部員量化考核制度例文(四篇)
- 2024年天貓運營主管崗位的具體職責(zé)概述范文(二篇)
- 【提升新時代建筑施工企業(yè)行政管理工作效果探究開題報告1800字】
- 2024年學(xué)生暑假學(xué)習(xí)計劃范例(二篇)
- 【《企業(yè)銷售人員激勵問題及策略探析-以查爾斯電子公司為例(數(shù)據(jù)論文)》13000字】
- 椎管內(nèi)麻醉的相關(guān)新進展
- 河北省衡水中學(xué)2022-2023學(xué)年高一上學(xué)期綜合素質(zhì)檢測二數(shù)學(xué)試題含解析
- 《中國潰瘍性結(jié)腸炎診治指南(2023年)》解讀
- 辦理寬帶拆機委托書
- 2024年ACOG-《第一產(chǎn)程及第二產(chǎn)程管理》指南要點
- 一線員工安全心得體會范文(3篇)
- 2高空作業(yè)安全技術(shù)交底(涉及高空作業(yè)者交底后必須簽字)
- 牛頓第三定律說課市公開課一等獎省賽課微課金獎?wù)n件
- (2024年)北京師范大學(xué)網(wǎng)絡(luò)教育《教育學(xué)原理》歡迎您
- 火車站物流園區(qū)建設(shè)項目物有所值評價報告
- 2024年工裝夾具相關(guān)項目營銷策略方案
評論
0/150
提交評論