


版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、-WORD格式-專業(yè)資料-可編輯-Hibernate學習筆記Java相關課程系列筆記之十四-WORD 格式 - 專業(yè)資料 - 可編輯 -筆記內容說明100%);Hibernate (梁建全老師主講,占筆記內容目錄一、Hibernate 的概述 11.1 Hibernated匡架的作用 11.2 Hibernate訪問數(shù)據(jù)庫的優(yōu)點 11.3 JDBC訪問數(shù)據(jù)庫的缺點1,1.4 Hibernate的設計思想2二、Hibernate的基本使用 32.1 Hibernate的主要結構 3.2.2 Hibernate主要的 API3.2.3 Hiber nate使用步驟 4.2.4 HQL 語句(簡要介
2、紹) 1.5三、數(shù)據(jù)映射類型 1.63.1 映射類型的作用 1.63.2 type映射類型的兩種寫法 16.四、Hibernate主鍵生成方式 18.4.1 五種生成方式 1.8五、Hiber nate 基本特性20.5.1 對象持久性 2.05.2處于持久狀態(tài)的對象具有的特點 2.0.5.3三種狀態(tài)下的對象的轉換 2.1.5.4批量操作:注意及時清除緩存 2.1.5.5案例:三種狀態(tài)下的對象使用 2.1.5.6一級緩存機制(默認開啟) 2.3.5.7一級緩存的好處 2.35.8管理一級緩存的方法 2.45.9延遲加載機制 2.65.10具有延遲加載機制的操作 2.6.5.11常犯的錯誤 2.
3、65.12延遲加載的原理 2.75.13 Sessio的get和load方法的區(qū)別 285 . 1 4延遲加載的好處 2.85 . 1 5案例:測試延遲加載 2.95.16案例:重構NetCTOSS資費管理模塊 305.17 Java Web 程序中如何用延 遲加 載操 作(OpenSessionInView) 3.5六、關聯(lián)映射 4.16.1 一對多關系 one-to-many4.16.2多對一關系 many-to-one4.36 . 3多對多關聯(lián)映射 many-to-many4.5.6.4關聯(lián)操作(查詢join fetch/級聯(lián)cascade 496.5繼承關系映射 5.7七、Hiber
4、nate 查詢方法63.7.1 HQL 查詢 6.37.2 HQL 和口 SQL 的相同點 6.3.7.3 HQL 和口 SQL 的不同點 6.3.7.4 HQL典型案例 64.7.5 Criteria查詢71.7.6 Native SQL原生 SQL 查詢7.3.八、Hibernate 高級特性75.8.1二級緩存 7.58.2二級緩存開啟方法及測試 7.5.8.3二級緩存管理方法 7.78.4 二級緩存的使用環(huán)境 7.88.5 查詢緩存 7.88.6查詢緩存開啟方法及測試 7.8.8.7 查詢緩存的使用環(huán)境 7.9九、Hibernate 鎖機制 8.09.1 悲觀鎖 8.09.2 悲觀鎖的
5、實現(xiàn)原理 8.09.3 悲觀鎖使用步驟及測試 8.09.4 樂觀鎖 8.39.5 樂觀鎖的實現(xiàn)原理 8.39.6 樂觀鎖使用步驟及測試 8.3十、 其他注意事項 8.510.1源碼服務器管理工具 8.5 10.2 利用 MyEclipse 根據(jù)數(shù)據(jù)表自動生成實體類、hbm.xml8.5.10.3根據(jù)實體類和 hbm.xml 生成數(shù)據(jù)表 8.810.4 Hibernate中分頁查詢使用join fatch的缺點.8810.5 Hibernate的子查詢映身寸 89.一、 Hibernate 的概述1.1 Hibernate 框架的作用Hibernate 框架是一個數(shù)據(jù)訪問框架(也叫持久層框 架,
6、可將實體對象變成持久對象,詳見第 5 章)。通過 Hibernate 框架可以對數(shù)據(jù)庫進行增刪改查操作,為業(yè) 務層構建一個持久層??梢允褂盟娲郧暗?JDBC 訪問數(shù)據(jù)。1.2 Hibernate 訪問數(shù)據(jù)庫的優(yōu)點1)簡單,可以簡化數(shù)據(jù)庫操作代碼。2)Hibernate可以自動生成 SQL,可以將 ResultSet 中的記錄和實體類自動的映射(轉化) 。3)Hibernate不和數(shù)據(jù)庫關聯(lián),是一種通用的數(shù)據(jù)庫 框架(支持 30 多種數(shù)據(jù)庫),可以方便數(shù)據(jù)庫移植。 任何數(shù)據(jù)庫都可以執(zhí)行它的 API。因為Hibernate的API 中是不涉及SQL語句的,它會根據(jù)Hibernate的配置文 件
7、,自動生成相應數(shù)據(jù)庫的 SQL 語句。1.3 JDBC 訪問數(shù)據(jù)庫的缺點1)需要編寫大量的復雜的 SQL 語句、表字段多時 SQL 也繁瑣、設置各個問號值。2)需要編寫實體對象和記錄之間的代碼, 較為繁瑣。3)數(shù)據(jù)庫移植時需要修改大量的 SQL 語句。1.4 Hibernate 的設計思想Hibernate是基于 ORM (Object Relation Mapping 思 想設計的,稱為對象關系映射。負責 Java對象和數(shù)據(jù) 庫表數(shù)據(jù)之間的映射。Hibernate是一款主流的ORM工具,還有其他很多 ORM 工具,女口: MyBatis(以前叫 iBatis)、臚A。Hibernate 功能
8、比MyBatis強大些,屬于全自動類型, MyBatis屬 于半自動。但全自動會有些不可控因素,因此有些公 司會用 MyBatis。ORM工具在完成Java對象和數(shù)據(jù)庫之間的映射后:1) 在查詢時,直接利用工具取出“對象”(不論是 查詢一條記錄還是多條記錄, 取出的都是一個個對象, 我們不用再去轉化實體了) 。2)在增刪改操作時,直接利用工具將“對象”更新 到數(shù)據(jù)庫表中(我們不用再去把對象轉成數(shù)據(jù)了) 。3)中間的 SQL+JDBC 細節(jié),都被封裝在了工具底 層,不需要程序員參與。注意事項:Java程序想訪問數(shù)據(jù)庫,只能通過 JDBC的方 式,而Hibernate框架也就是基于 ORM思想對
9、JDBC的封裝。Hibernate是以“對象”為單位進行數(shù)據(jù)庫的操 作。二、 Hibernate 的基本使用2.1 Hibernate 的主要結構1) hibernate.cfg.xml(僅 1 個):Hibernate 的主配置 文件,主要定義數(shù)據(jù)連接參數(shù)和框架設置參數(shù)。注意事項:就是個 xml 文件,只是名字比較奇 葩!2) Entity 實體類( n 個,一個表一個):主要用于封 裝數(shù)據(jù)庫數(shù)據(jù)。3) hbm.xml 映射文件( n 個):主要描述實體類和數(shù) 據(jù)表之間的映射信息。描述表與類,字段與屬性的對 應關系。注意事項: hbm.xml 是個后綴,如:命名可寫Cost.hbm.xm。2
10、.2 Hibernate 主要的 API1) Configuration:用于加載 hibernate.cfg.xml配置信 息。用于創(chuàng)建 Session Factory2) SessionFactor:y 存儲了 hbm.xml 中描述的信息, 內置了一些預編譯的SQL,可以創(chuàng)建SessiorM象。3) Session負責對數(shù)據(jù)表執(zhí)行增刪改查操作。表示 Java 程序與數(shù) 據(jù)庫的 一 次 連接 會話 , 是對以 前 的 Conn ection對象的圭寸裝。和 JSP中的session不是一回 事,就是名字一樣而已。4) Query:負責對數(shù)據(jù)表執(zhí)行特殊查詢操作。5) Transaction負
11、責Hibernate操作的事務管理。默-WORD格式-專業(yè)資料-可編輯-認情況下Hibernate事務關閉了自動提交功能,需要顯 式的追加事務管理(如調用Transaction對象中的commit();提交事務)!注意事項:這些API都是在Hibernate包下的,導包別導 錯!第一次訪問數(shù)據(jù)庫比較慢,比較耗資源,因為 加載的信息多。2.3 Hibernate使用步驟step1 :建立數(shù)據(jù)庫表。step2:建立Java工程(Web工程也可),引入Hibernate 開發(fā)包和數(shù)據(jù)庫驅動包。必須引入的包:hibernate3.ja、 cglib.jar、 dom4j.jar、com mon s-c
12、ollecti on s.jar、com mon s-logg in g.ja-r 等step3:添加hibernate.cfg.xm配置文件,文件內容如下: org.hibernate.dialect.OracleDialectv!-不知道數(shù) 據(jù)庫版本就寫 OracleDialect -v/propertyx!-可 在hiber nate3.jar中org.hibernate.dialec包下查看名字 -vproperty n ame=c onn ectio n.url jdbc:oracle:thi n:localhost:1521:dbcha ng vpropertyn ame=c on
13、n ectio n. usernamesystem vpropertyn ame=c onn ecti on .passwordcha ngv/propertyvproperty n ame=c onn ectio n.driver_class oracle.jdbc.driver.OracleDrivervproperty n ame=show_sqltruevproperty n ame=format_sqltruev/property v!-指定映射描述文件-vmapp ingresource=org/tare na/en tity/Cost.hbm.xml / v/sessi on-
14、factoryv/hiber nate-c on figurati on屆性名dialect頂定眾揺專龍方言雖然各稱荽焉互豁抬SQL恬 準,但不同的額揭所實現(xiàn)的SQL語句賂有不同1所 :冒逛庫菟方言応垠JE所柔用城庫的不同設置不同 籠方言類.取如:org.hibernate.dialect.Oracle9Dialectf 針Orade ) org.hibernate.dialect.1,1 y SQLDiaied: WT MySQL) org.hibernate.dtalect.SQLSefv&rDialect (針 77 SQLServer Jco nnection.d nvess瓏琳瑋JD
15、BC返就黃connection url艇 JDBC荷庫的URLcon nm di on. u 占 mm 呂 mg區(qū)進接數(shù)據(jù).芽的用戶名connection passrdShow_sc|可選鑫取.如黒設置為i true r則tibernate將U 日586W式箱岀執(zhí)行的SQL皓句r用亍瞬遍層 hibemateKji r 冥獸認道為 false,rF ormat_sqi可選參數(shù).如頁設置尢true r貝hibernate蠱二 SQL語句對逛権m 按照舍理分行印縮斗疋式亙亍 SQL :訖,婦罠為false則不程淫梧式舅生認週力 -false-注意事項:應該放在源文件的 src目錄下,默認 為hibe
16、rnate.cfg.xm。文件內容是 Hibernate工作時 必須用到的基礎信息。step4:編寫Entity實體類(也叫POJO類),例如:資 費實體類Costprivate Integer id; /資費 IDprivate StrincfeeName; /資費名稱private Integer baseDuration; /基本時長 private Float baseCost; /基本定費private Float un itCos t; / 單位費用privateString status; 0:開通;1 暫停;private String descr; /資費信息說明privat
17、eDate createTime; 創(chuàng)建日期private Date startTime; / 啟用日期privateStri ng costType; / 資費類型getter/setter 方法注意事項:POJO類表示普通類(Plain Ordinary Old Object),沒有格式的類,只有屬性和對應的 getter/setter方法,而沒有任何業(yè)務邏輯方法的類。這種類最多再加入 equals() hashCode(、toString() 等重寫父類Object的方法。不承擔任何實現(xiàn)業(yè)務 邏輯的責任。step5:編寫hbm.xml映射(文件)描述信息:映射文 件用于指明POJO類和表
18、之間的映射關系(xx屬性對 應xx字段),一個類對應一個映射文件。例如:Cost.hbm.xml 內容如下:!- -!- 表明此為主鍵列,且必須寫否則 xml報錯,主鍵映射-!- 或雙標簽 -vparamname=sequenceCOST_SEQ_CHANG v/ge neratorvpropertyn ame= nametype=java.la ng.Stri ng vcolumn name=NAME /vpropertyn ame=baseDurati ontype=java.la ng.l nteger-WORD格式-專業(yè)資料-可編輯-vcolu mn name=BASE_DURATIO
19、N / v/propertyvpropertyn ame=baseCosttype=javaa ng.Float vpropertyn ame=startTimetype=java.sql.Datevcolumn name=STARTIME / ,主鍵歹U同理!-其他省略v/hibernate-mappi ng注意事項:映射文件默認與POJO類放在一起;命名規(guī)則 為:類名.hbm.xm。hbm.xml中已寫出的屬性與字段的映射要對應,若表中沒有某個字段,卻寫了映射關系,則報錯:找不到實體類。step6:利用 Hibernate API 實現(xiàn) DAO1)新建HibernateUtil類,用于圭寸
20、裝創(chuàng)建 Session的方 法。如下:每個用戶會對應一個Session但是Sessi on Factor是共享的。public class Hiber nateUtil private static Session Factory sf;static不用每次都加載配置信息,所以放 static 塊中,否則每次都加載會耗費資源Configuration conf=new Configuration();/ 加載 主配置 hibernate.cfg.xmlconf.con figure(/hiber nate.cfg.xml);sf=c on f.buildSessi on Factory。;/獲
21、 取Session Factorypublic static Session getSession()獲取 Session Sessi on sessi on =sf.ope nSessi on(); retur n sessi on; 2) 新建 CostDAO 接口public Cost fin dByld(i nt id);public voidsave(Cost cost);public void delete(i nt id); public void update(Cos cost);public List fin dAll();3) 新建CostDAOImpl類,用于實現(xiàn)Cost
22、DAO接口 public class CostDAOImpl impleme nts CostDAO private Sessi on sessi on;public CostDAOImpl () / 不想老寫獲得 session 的方法,就寫在構造器中sessi on=Hiber nateUtil.getSessi on();/* get方法執(zhí)行查詢,按主鍵當條件查詢,如何判 斷是主鍵,是根據(jù)寫的描述文件來定,get方法就是fin dByld,就是按主鍵去查,需指定:操作哪個類和 id(主鍵)條件值即可,其他條件查詢做不了*/public Cost fin dById(i nt id) /S
23、essi on sessi on=HibernateUtil.getSessi on ();id);Costcost=(Cost)sessi on .get(Cost.class,sessi on. close(); retur n cos t;/* save方法執(zhí)行增加操作,注意 1獲取事務并開 啟,增刪改要注意,查詢可以不管事務,因為沒對數(shù) 據(jù)庫進行修改;注意 2:主鍵值根據(jù)hbm.xml中的定義生成,執(zhí)行后,會先獲取序列值,再 去做insert操作。即先:select COST_SEQ_CHANG.nextval from dual: 然后:insert into */public vo
24、id save(Cost cost) /Sessi on sessi on=HibernateUtil.getSessi on ();Tran sactio ntx=sessi on .begi nTran sactio n();/打開 事務sessi on. save(cost);mit();/ 提交事務session.close();釋放/* delete方法執(zhí)行刪除操作,由于Hibernate以“對 象”為單位進行數(shù)據(jù)庫操作,所以這里要傳進去一個 對象,雖然是個對象,但還是按主鍵做條件刪除,只 要把主鍵值設置上就行,其他非主鍵值不用管。也可 先通過id查再刪*/public void d
25、elete(i nt id) /Sessi on sessi on=HibernateUtil.getSessio n();Transaction tx=session.beginTransaction(); Cost cost=new Cost();cost.setId(id);sessi on. delete(cost);mit(); sessi on. close(); /* update方法執(zhí)行修改操作,*/public void update(Cost cost) /Sessi on sessi on=HibernateUtil.getSessio n(); Transaction
26、tx=session.beginTransaction(); session.update(cost);將cost對象更新到數(shù)據(jù)庫mit();sessi on. close();/* 特殊查詢,SQL 語句:String sql=select * fromCOST_CHANG;HQL 語句:String hql=from Cost; ( Hibernate Query Language是面向對象的查詢語句。from后寫映射的類名,它是Hibernate中特有的查詢 語句,根據(jù)映射的類去查詢。*/public List fin dAll() /Sessi on sessi on=Hibernat
27、eUtil.getSessi on ();String hql=from Cost;/HQL 語句Query query=sessi on. createQuery(hql);List list=query.list();/ 執(zhí)行查詢,返回 List集合sessi on. close(); return list;4) 新建TestCostDAO類,使用junit測試Testpublic void testFindByld() 當 get 方法沒有記錄 時,返回nullCostDAO costDao = new CostDAOImpl();Cost cost = costDao.fi ndBy
28、Id(1);st.getBaseDurati on();System.out.pri ntln (cost.getBaseCost();System.out.pri ntl n(cost.getU nitCost();System.out.pri ntln (cost.getDescr();Testpublic void testSave()/id 主鍵列由 Hibernate 管 理,這里不用設置Cost cost=new Cost(); cost.setName(2013計時);cost.setU nitCost(0.8f); cost.setDescr(計時,0.8元/小時。);cost
29、.setStatus(0); cost.setCreaTime( new Date(System.curre ntTimeMillis();CostDAO costDao = new CostDAOImpl();costDao.save(cost); Testpublic void testUpdate()開通某個資費,把狀態(tài) 由0變?yōu)?CostDAO costDAO=new CostDAOImpl();/*注意事項:更新部分字段,不能和實現(xiàn)類中 的刪除那樣,做一個對象出來!否則沒設置的字段將 被改為空! 即不能:Cost cost=new Cost() cost.setld(90);cost
30、.setStatus(1);cost.setStartTime( neDate(System.currentTimeMillis(); */Cost cost=costDAO.findByld(90); 只能先通過 id找到帶有所有值的對象cost.setStatus(1);/然后再對部分字段進行更 新,才能避免把其他字段更新為空cost.setStartTime( newDate(System.curre ntTimeMillis(); costDAO.update(cost);Test public void testDelete()CostDAO costDAO=new CostDAOI
31、mpl(); costDAO.delete(90); Testpublic void testF in dAll()CostDAO costDAO=new CostDAOImpl(); List list=costDAO.fi ndAll();for(Cost c:list) System.out.println(c.getName());2.4 HQL語句(簡要介紹)簡要介紹見2.3節(jié)中step6中的3)特殊查詢(本 頁最上)。詳細介紹見第七章。-WORD 格式 - 專業(yè)資料 - 可編輯 -三、數(shù)據(jù)映射類型hbm.xml 在描述字段和屬性映射時,采用 type 屬性 來指定映射類型。3.1
32、映射類型的作用主要負責實現(xiàn)屬性和字段值之間的相互轉化。3.2 type 映射類型的兩種寫法1)指 定 Java 類 型 , 例 如 : java.lang.String、javaang.lnteger,不能寫成 String 2)指定Hibernate類型,例如: 整數(shù): byte、short、integer、long; 浮點數(shù): float、double;字符串: string; 日期和時間:date (只處理年月日),time (只處理時分秒),timestamp (處理年月曰時分秒); 布爾值: true/falsechar(1() 數(shù)據(jù)庫存Y/N ,顯示時自動轉為 true/false
33、)、 true/falsechar(1() 數(shù)據(jù)庫存 T/F ,顯示時 自動轉為 true/false)、true/falsev-boolean-bit (數(shù)據(jù)庫存1/0,顯示時自動轉 為 true/false); 其他:blob (以字節(jié)為單位存儲大數(shù)據(jù))、clob (以字符為單位存儲大數(shù)據(jù)) 、big_decima、l big_integer;注意事項:Hibernate類型都是小寫!建議使用Hibernate 類型。-WORD格式-專業(yè)資料-可編輯-3) 所以 2.3 節(jié)中 step5的 Cost.hbm.xml 內的 type 也 可這樣寫:vpropertyn ame= name t
34、ype=stri ngvproperty name=baseCost type=floatvproperty name=startTime type=date注意事項:java.util.Date有年月日時分秒毫秒,但如果用 date映射,則只把年月 日存進數(shù)據(jù)庫; java.sql.Date只有年月 日。java.sql.Timestamp有 年月日時分秒毫秒。若在頁面顯示按特定格式顯示則用Struts2標簽:HibernateBJSi 類塑對應BJavaS據(jù)類型對應的転準SQL字段類型integerirt 或 java lang IntegerINTEGERlongFong 或 lava.
35、iang LengBIG1NTshortshort Etejava lang. ShortSMALLINTfloatfloat 或但va lang FloatFLOATdoubledouble 或 ava lang.DaiibteDOUBLEbig decimaijiava math BigDecimaiNUMERICcharacterjava lang StringCHAR(1)stringjava.lang StringVARCHARbytebytelang ByteT1NYINTbooleanboolean 或java lartg Booleansrryesnobooleanlang B
36、ooleanCHAFyi) ( T or NJ )trw_fa1seboolean alt java lang BooleanCHAR(1) ( T or F )datejava.util.Date 矚的上占ql.Dd怕DATE四、Hibernate主鍵生成方式Hibernate負責管理主鍵值。它提供了多種主鍵生成 方式。4.1五種生成方式1) sequenee可以按指定序列生成主鍵值。只適用 于Oracle數(shù)據(jù)庫。不擔心并發(fā)量!例如:vgenerator class=sequence vparam name=sequence序 歹U 名字 v/paramx/ge nerator注意事項:創(chuàng)建
37、序列時如果不指定參數(shù),默認從 1開始,步進是1。2) identity:按數(shù)據(jù)庫自動增長機制生成主鍵值。一 般適用于MySql、SQLServer數(shù)據(jù)庫。例如:3) native: Hibernate會根據(jù)方言類型不同,選擇不同的主鍵生成方式。如果是OracleDialect則會選擇sequenee 如果是 MySQLDialect 則會選擇 identity。例如: 注意事項:如果是MySql數(shù)據(jù)庫,vparam name=sequenee:序列名字 是不起作用 的,但也不會出錯;如果是Oracle數(shù)據(jù)庫,vparam name=sequence序列名字 就會起作 用,所以一般我們會加上這句
38、話,這樣通用性更 強。4)assigned Hibernate會放棄主鍵生成,采用此方 法,需要在程序中指定主鍵值。例如:vgenerator class=assignedv/generator5)in creme nt: Hibernate 先執(zhí)行 select max(id) 語句 獲取當前主鍵的最大值,執(zhí)行加 1操作,然后再調用 insert語句插入。Oracle和MySQL都可用。但不適合并 發(fā)量很大的情況!例如:vge nerator class= in creme ntv/ge nerator6) uuid/hilo : uuid:按UUID 算法生成一個主鍵值 (字符串類型);h
39、ilo :按高低位算法生成一個主鍵值 (數(shù)值類型)。例如:vgenerator class=hilo注意事項:主鍵一般都是自動生成的。我們一般不使用業(yè) 務數(shù)據(jù)作為主鍵,因為業(yè)務邏輯的改變有可能 會改變主鍵值。主鍵生成方式是枚舉類型,只能從一個有限的 范圍內選擇,不能自定義。其中,seque nee是 使用序列生成主鍵(Oracle數(shù)據(jù)庫經(jīng)常使用)。五、Hibernate基本特性5.1對象持久性在Hibernate使用過程中,實體對象可以具有以下三 種狀態(tài):1) 臨時狀態(tài):采用new關鍵字創(chuàng)建的對象,該對象 未與Session發(fā)生關聯(lián)(未調用Session的API)。也叫臨時對象。臨時狀態(tài)的對象
40、會被 Java的垃圾回收機制回收。2)持久狀態(tài):實體對象與 Sessio n發(fā)生關聯(lián)(調用 了 Session的 get、load、save update等 API)。也叫持 久對象。3)游離狀態(tài):原來是持久狀態(tài),后來脫離了 Session 的管理。如:Session被關閉,對象將從持久狀態(tài)變?yōu)橛坞x狀態(tài),同時垃圾回收機制可以回收掉,不再占用 緩存空間了。5.2處于持久狀態(tài)的對象具有的特點1)對象生命期持久,垃圾回收機制不能回收。2) 對象的數(shù)據(jù)可以與數(shù)據(jù)庫同步(即對象中的數(shù)據(jù) 發(fā)生改變,則數(shù)據(jù)庫中的數(shù)據(jù)自動同步)。由Session 對象負責管理和同步。3)對象在Session的一級緩存中存放(
41、或者說在 Session存中的對象都是持久對象)。注意事項:Sessio n.close有兩個作用:關閉連 接、釋放資源使對象變?yōu)橛坞x狀態(tài),當對象的引用不存在時,對象才被回收。沒被回收時,對 象中的數(shù)據(jù)還在!5.3三種狀態(tài)下的對象的轉換Transientgeto : IcsdQ findQ iterate Q ftc.javeQsaveOrUpdateOPersistentevictT closeQ * clearfl * deleteQi updateQ saveOrUpdateQ lockQgarbagegarbageDetached* affects all instances in a
42、 Session5.4批量操作:注意及時清除緩存Tran sacti on tx = sessi on .begi nTran sacti on(); for(i nt i=0;i100000;i+) Foo foo = new Foo();session.save(foo);/設置 foo 屬性 if(i%50=0)夠50個對象,與數(shù)據(jù)庫同步下,并清除緩存sessi on .flush(); 同步 sessi on. clear();/清 除緩存 mit();5.5案例:三種狀態(tài)下的對象使用當持久對象數(shù)據(jù)改變后,調用sessio n.flush方法,會與數(shù)據(jù)庫同步更新。commit()方法,
43、內部也調用了 flush(方法,因此使用 commit()方法可以省略flush()方法的調用。Testpublic void test1()/Foo 實體有 id、name salary hireDate marry等屬性Sessi onsessi on=HibernateUtil.getSessi on();Tran sacti on tx=sessi on .begi nTran sacti on();Foo foo=(Foo)sessi on. get(Foo.class, 1);/fo唄有持 久性foo.setName(cha ng); foo.setSalary(6000);/*提
44、交事務,若后面不寫flush,只寫提交commit, 則也能執(zhí)行更新操作。因為 commit在內部會先調用 flush,再提交事務,所以此時flush可不寫*/mit();/*觸發(fā)同步動作,同步和提交是兩回事。數(shù)據(jù)有變 化才同步(更新),沒變化不會更新*/session.flush(); session.close();/關閉 session釋放 資源 Testpublic void test2()Foo foo=new Foo();foo.setName(tigger); foo.setSalary(8000);foo.setMarry(true); foo.setHireDate (new
45、Date(System.curre ntTimeMillis();Sessi onsessi on=HibernateUtil.getSessi on();Tran sacti on tx=sessi on .begi nTran sacti on();sessio n.save(foo);/以上都是臨時狀態(tài),此時由臨 時狀態(tài)轉為持久狀態(tài)foo.setSalary(IOOOO);/修改foo持久對象的數(shù)據(jù), 也是更新操作,可不寫update方法mit(); 同步、提交session.close();Testpublic void test3()Sessi onsessi on=Hibernat
46、eUtil.getSessi on();Tran sacti on tx=sessi on .begi nTran sacti on();Foo foo=(Foo)sessi on. get(Foo.class, 2);/fo唄有持 久性sessio n.clear();/下面的則不會與數(shù)據(jù)庫同步了 foo.setName(常);foo.setSalary(8800);mit();/session.flush(); 數(shù)據(jù)有變化才同步update,沒變化不會 updatesessi on. close();5.6 一級緩存機制(默認開啟)一級緩存被稱為 Session級別的緩存:每個 Sessi
47、on 都有自己獨立的緩存區(qū),該緩存區(qū)隨著Sessior創(chuàng)建而開辟(由 SessionFactor創(chuàng)建),隨著 Session .close而釋 放。該緩存區(qū)可以存儲當前Sessio咲聯(lián)的持久對象。只 有在緩存區(qū)中,Session才管該對象。5.7 一級緩存的好處Hibernate在查詢時,先去緩存當中查找,如果緩存中沒有,才去數(shù)據(jù)庫查詢。如果利用Session對同一個對象查詢多次,第一次去數(shù)據(jù)庫查,后續(xù)的會從緩存 查詢,從而減少了與數(shù)據(jù)庫的交互次數(shù)。5.8管理一級緩存的方法1) session.evict方法:將對象清除。2) session.clear方法:清除所有對象。3) session
48、.close方法:清除所有對象,并關閉與數(shù) 據(jù)庫的連接。注意事項:不同的session的緩存區(qū)不能交叉訪 問。4) 案例:測試一級緩存Testpublic void test1()Sessi onsessi on=HibernateUtil.getSessi on ();Foo foo1=(Foo)sessi on. get(Foo.class, 1);第 一次查 詢System.out.println(foo1.getName();/能出現(xiàn) SQL 查詢語句Foo foo2=(Foo)sessi on. get(Foo.class, 1);后 續(xù)查詢System.out.println(fo
49、o2.getSalary();不能出現(xiàn) SQL 查詢語句sessi on. close();Testpublic void test2()Sessi onsessi on=HibernateUtil.getSessi on ();Foo foo1=(Foo)sessi on. get(Foo.class, 1);第一次查 詢System.out.println(foo1.getName();/能出現(xiàn) SQL 查詢語句session.evict(foo1);/ 或 session.clear(foo1);Foo foo2=(Foo)sessi on. get(Foo.class, 1);后 續(xù)查詢 System.out.println(foo2.getSalary();能出現(xiàn) SQ
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2020英語試卷小學
- 統(tǒng)編版(2024)七年級上冊道德與法治《探究與分享+運用你的經(jīng)驗+單元思考與行動》 參考答案
- 熱力管網(wǎng)施工方案
- 廣西北流市2025屆中考生物考試模擬沖刺卷含解析
- 臨時施工便道合同范本
- 廠家采購原料合同范本
- 前臺文員的跨文化溝通能力提升計劃
- 加強市場定位與品牌策略的計劃
- 行業(yè)變化對團隊的影響計劃
- 提升企業(yè)安全管理水平的措施計劃
- 2024年度供應商管理培訓課件
- 6、水平四+田徑18課時大單元計劃-《雙手頭上前擲實心球》
- 電梯維保員服務用語培訓
- 2024-2030年中國寫字樓行業(yè)發(fā)展態(tài)勢規(guī)劃分析報告版
- 《管理信息系統(tǒng)》考試復習題庫(含答案)
- 2024年9月抖音短視頻及直播電商月報
- 人教版初中全部英語單詞表
- 2024年浙江省中考社會試卷真題(含標準答案及評分標準)
- 期末復習《《認識100以內的數(shù)》復習》(教案)2023-2024學年數(shù)學一年級下冊
- 2024年醫(yī)師定期考核必刷題庫附含參考答案
- 神經(jīng)外科護理病例討論-腦膜瘤課件
評論
0/150
提交評論