學(xué)習(xí)筆記hibernateJava相關(guān)課程系列之十四_第1頁
學(xué)習(xí)筆記hibernateJava相關(guān)課程系列之十四_第2頁
學(xué)習(xí)筆記hibernateJava相關(guān)課程系列之十四_第3頁
學(xué)習(xí)筆記hibernateJava相關(guān)課程系列之十四_第4頁
學(xué)習(xí)筆記hibernateJava相關(guān)課程系列之十四_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目一、Hibernate的概 Hibernate框架的作 Hibernate數(shù)據(jù)庫的優(yōu) JDBC數(shù)據(jù)庫的缺 Hibernate的設(shè)計思 二、Hibernate的基本使 Hibernate的主要結(jié) Hibernate主要的 Hibernate使用步 HQL語句(簡要介紹 三、數(shù)據(jù)映射類 type映射類型的兩種寫 四、Hibernate主鍵生成方 五、Hibernate基本特 Session的get和load方法的區(qū) 案例:重構(gòu)NetCTOSS資費管理模 JavaWeb程序中如何用延遲加載操作 六、關(guān)聯(lián)映 關(guān)聯(lián)操作(查詢joinfetch/級聯(lián) 七、Hibernate查詢方 HQL查 HQL和SQL的相同 HQL和SQL的不同 HQL典型案 Criteria查 NativeSQL原生SQL查 八、Hibernate高級特 二級緩 查詢緩 九、Hibernate鎖機 悲觀 樂觀 十、其他注意事 利用MyEclipse根據(jù)數(shù)據(jù)表自動生成實體類、 根據(jù)實體類和hbm.xml生成數(shù)據(jù) 一、Hibernate的概述Hibernate框架的作用Hibernate框架是一個數(shù)據(jù)框架(也叫持久層框架,可將實體對象變成持久對象,層。可以使用它替代以前的JDBC數(shù)據(jù)。Hibernate數(shù)據(jù)庫的優(yōu)點HibernateSQLResultSet中的記錄和實體類自動的映射(轉(zhuǎn)HibernateSQL語句。JDBC數(shù)據(jù)庫的缺點需要編寫大量的復(fù)雜的SQL語句、表字時SQL也繁瑣、設(shè)置各個問號值SQLHibernate的設(shè)計思想Java對象和數(shù)據(jù)庫表數(shù)據(jù)之間的映射。HibernateORMORM工具,如:MyBatis(以前叫iBatisMyBatis。ORMJava(SQL+JDBCJava程序想數(shù)據(jù)庫,只能通過JDBC的方式,而Hibernate框架也就是基ORMJDBC的封裝。Hibernate二、Hibernate的基本使用Hibernate的主要結(jié)構(gòu):HibernatexmlEntity實體類(n個,一個表一個hbm.xml映射文件(n個注意事項:hbm.xmlCost.hbm.xmlHibernate主要的Configurationhibernate.cfg.xmlSessionFactory。SessionSessionJava程序與數(shù)據(jù)庫的一次連接會話ConnectionJSPsession不是一回事,就是名字一樣而已TransactionHibernateHibernate事務(wù)關(guān)閉了自動提交功能,需要顯式的追加事務(wù)管理(Transactioncommit();提交事務(wù)APIHibernate第一次數(shù)據(jù)庫比較慢,比較耗資源,因為加載的信息多Hibernate使用步驟step2:建立Java工程(Web工程也可,引入Hibernate開發(fā)包和數(shù)據(jù)庫驅(qū)動包。必須引入的包:hibernate3.jar、cgl、、mons- 、mons-logging.jar…<?xmlversion='1.0'encoding='UTF-<?xmlversion='1.0'encoding='UTF-<!DOCTYPEhibernate-configuration"-//Hibernate/HibernateConfigurationDTD3.0//EN"<propertyname="dialect"><!--HibernateSQLorg.hibernate.dialect.OracleDialect<!--OracleDialect</property><!--hibernate3.jar中org.hibernate.dialect<propertyname="connection.url"><property<property<property<propertyname="connection.driver_class">hibernateSQL<property<!--SQL<property<!-- 注意事項:應(yīng)該放在源文件的src 下,默認為hibernate.cfg.xml。文件內(nèi)容是Hibernate工作時必須用到的基礎(chǔ)信息。privateIntegerid;privateIntegerbaseDuration;基本時長privateIntegerid;privateIntegerbaseDuration;基本時長privateFloatunitCost;//單位費用privateStringdescr;//資費信息說明privateDatestartTime;//啟用日期……getter/setterprivateStringfeeNameprivateFloatbaseCost;privateStringstatus0:開通;1:暫停;privateDatecreateTime;//創(chuàng)建日期privateStringcostType;注意事項:POJO類表示普通類( Object,屬性和對應(yīng)的getter/setter方法,而沒有任何業(yè)務(wù)邏輯方法的類。這種類最多再加equals()、hashCode()、toString()Object的方法。不承擔(dān)任何實現(xiàn)業(yè)step5hbm.xml映射(文件)POJO類和表之間的映射關(guān)系(xxxx字段,一個類對應(yīng)一個映射文件。例如:Cost.hbm.xml內(nèi)容如下:<?xmlversion="1.0"encoding="utf-<!DOCTYPEhibernate-map PUBLIC"-//Hibernate/HibernateMap DTD3.0//EN" <!--定義COST_CHANG表和Cost類型之間的映射信 <hibernate- package="包名寫這也行<!--name:包名.類名,指定是哪個類;table:數(shù)據(jù)庫中哪個表;catalogOracle而MySQl而言為某個用戶(MySQl是在用戶下建表,Oracle是在庫中建,不寫也行(若用工具則會自動生成。例如,select*fromcost_changhibernate.cfg配置文件中定義的庫(或用戶)select*fromsystem.cost_chang<classname="org.tarena.entity.Cost"table="COST_CHANG" <id></id>xml<idname="id"<columnname="ID"/><!--或 <columnname="ID"></column>--<!--指定主鍵值生成方式,采用序列方式生成主鍵,僅對添加操作有效<generator<paramname="sequence">COST_SEQ_CHANG</param>指定序列名

<propertyname="name"type="java.lang.String"><!--<columnname="NAMElength、not-null屬性,如:length="20"<propertyname="baseDuration"type="java.lang.Integer"><!--<propertyname="baseCost"type="java.lang.Float"><!--類型要和實體定義的相同<columnname="BASE_COST"<columnname="STARTIMEjunitCopyTrace查看錯誤列<!--也可寫成<propertyname="type="column="/property> POJO類放在一起;命名規(guī)則為:類名.hbm.xmlstep6HibernateAPIHibernateUtilSessionpublicclassHibernateUtilpublicclassHibernateUtilprivatestaticSessionFactoryConfigurationconf=newConfiguration();//hibernate.cfg.xmlsf=conf.buildSessionFactory();//獲取SessionFactory publicstaticSessiongetSession(){//獲取SessionSessionsession return CostDAOpublicpublicCostfindById(intpublicvoiddelete(intid);publicList<Cost>findAll();publicvoidsave(Costpublicvoidupdate(CostCostDAOImplCostDAOpublicclassCostDAOImplimplementsCostDAO{privateSessionsession;publicCostDAOImplsession /**get方法getfindByIdid(主鍵)條件值即可,其他條件查詢做不了*/publicCostfindById(intid)//SessionCostcost=(Cost)session.get(Cost.class,id); return /**save方法1:獲取事務(wù)并開啟,增刪改要注意,查詢可以不管insert操作。即先:selectCOST_SEQ_CHANG.nextvalfromdual;然后:insertinto…… publicvoidsave(Costcost){//SessionTransactiontx=session.beginTransaction();//打開事務(wù) id查再刪*/publicvoiddelete(intid)//SessionTransactiontx=session.beginTransaction(); Costcost=newCost(); /**update方法*/publicvoidupdate(Costcost//Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();//Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();}/**特殊查詢,SQL語句:Stringsql="select*fromHQL語句:Stringhql="fromCost";(HibernateQueryLanguage)是面向?qū)ο蟮牟樵冋ZfromHibernate*/publicList<Cost>findAll(){//Sessionsession=HibernateUtil.getSession();Stringhql="fromCost";//HQL語句Query return TestCostDAOjunitpublicvoidtestFindById(){//getCostDAOcostDao=newCostDAOImpl(); Costcost=costDao.findById(1);System.out.println(cost.getBaseCost());System.out.println(cost.getUnitCost()); publicvoidtestSave(){//idHibernateCostcost=new cost.setName("2013計時cost.setUnitCost(0.8f);cost.setDescr("2013-08-09計時,0.8元/小時。"); CostDAOcostDao=newCostDAOImpl(); publicvoidtestUpdate(){//01CostDAOcostDAO=newCostDAOImpl();/**注意事項:更新部分字段,不能 則沒設(shè)置的字段將被改為空!即不能:Costcost=newCost(); cost.setStartTime(newDate(System.currentTimeMillis())); Costcost=costDAO.findById(90);//只能id找到帶有所有值的對象空cost.setStartTime(newDate(System.currentTimeMillis())); publicvoidCostDAOcostDAO=newCostDAOImpl(); publicvoidCostDAOcostDAO=newCostDAOImpl();List<Cost>for(Costfor(Cost HQL語句(簡要介紹)2.3step63)特殊查詢(本頁最上三、數(shù)據(jù)映射類型hbm.xmltype映射類型的作用type映射類型的兩種寫法Java類型,例如:java.lang.String、java.lang.IntegerStringHibernate ,time(,timestamp(;true/falsetrue/false<-true_false->char(1)(T/Ftrue/falsetrue/false⑥其他:blob(以字節(jié)為單位大數(shù)據(jù)、clob(以字符為單位大數(shù)據(jù)注意事項:HibernateHibernate<propertyname="name"type="string"><columnname="NAME"<propertyname="baseCost"type="float"><column<propertyname="name"type="string"><columnname="NAME"<propertyname="baseCost"type="float"><columnname="BASE_COST"<propertyname="startTime"type="date"><columnname="STARTIME"據(jù)庫;java.sql.Date只有年月日。java.sql.Timestamp有年月日時分秒毫秒。若在頁面顯示按特定格式顯示則用Struts2<s:datename="屬性名format="yyyy-MM-dd四、Hibernate主鍵生成方式Hibernate五種生成方式例如:<generator<paramname="sequence">序列名字例如:<generator<paramname="sequence">序列名字11。2)identityMySql、SQLServer數(shù)據(jù)例如:<generator例如:<generatornativeHibernate會根據(jù)方言類型不同,選擇不同的主鍵生成方式。如果是例如:<generatorOracleDialectsequenceMySQLDialect例如:<generatorMySql數(shù)據(jù)庫,<paramname="sequence">序列名字</param>是Oracle數(shù)據(jù)庫,<paramname="sequence">序例如:<generatorassigned:例如:<generatorincrement:Hibernateselectmax(id)...例如:<generator例如:<generator;hilo例如:例如:<generatorsequence是使用序列生成主鍵(Oracle數(shù)據(jù)庫經(jīng)常使用五、Hibernate基本特性對象持久性HibernatenewSession發(fā)生關(guān)聯(lián)(APIAPISession的管理。如:Session被關(guān)閉,對象將從持久狀態(tài)變?yōu)橛坞x狀態(tài),同時回收機制可以回收掉,不再占用緩存空間了。處于持久狀態(tài)的對象具有的特點對象生命期持久,回收機制不能回收同步Session對象負責(zé)管理和同步。Session的一級緩存中存放(Session緩存中的對象都是持久對象注意事項:Session.close();有兩個作用:①關(guān)閉連接、釋放資源②使對象變?yōu)橛坞x狀態(tài),當對象的不存在時,對象才被回收。沒被回收時,對象中的數(shù)據(jù)還在!三種狀態(tài)下的對象的轉(zhuǎn)換批量操作:注意及時清除緩存Transactiontx=session.beginTransaction();for(inti=0;i<100000;i++){ FooTransactiontx=session.beginTransaction();for(inti=0;i<100000;i++){ Foofoo=newFoo();session.save(foo);//fooif(i%50==0){//50 案例:三種狀態(tài)下的對象使用publicvoidtest1(){//Fooid、name、salary、hireDate、marrySessionsession=HibernateUtil.getSession();TransactionFoofoo=(Foo)session.get(Foo.class,1);//foo /**flushcommitflushflush*/ session.close();//關(guān)閉session釋放資源 publicvoidFoofoo=newFoo(); foo.setHireDate(newDate(System.currentTimeMillis()));Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();foo.setSalary(10000);//fooupdate方法

publicvoidSessionsession=HibernateUtil.getSession();TransactionFoofoo=(Foo)session.get(Foo.class,2);//foo具有持久性 一級緩存機制(默認開啟)SessionSession都有自己獨立的緩存區(qū),該緩存區(qū)Session創(chuàng)建而開辟(SessionFactory創(chuàng)建Session.close()而釋放。一級緩存的好處Hibernate在查詢時,先去緩存當中查找,如果緩存中沒有,才去數(shù)據(jù)庫查詢。如果利管理一級緩存的方法注意事項:不同的session的緩存區(qū)不能交叉publicvoidtest1(){ Sessionsession=HibernateUtil.getSession();Foofoo1=(Foo)session.get(Foo.class,1);//第一次查詢System.out.println(foo1.getName());//SQL查詢語句Foofoo2=(Foo)session.get(Foo.class,1);//后續(xù)查詢System.out.println(foo2.getSalary());//SQL查詢語句 publicvoidtest2(){ Sessionsession=HibernateUtil.getSession();Foofoo1=(Foo)session.get(Foo.class,1);//第一次查詢System.out.println(foo1.getName());//能出現(xiàn)SQL查詢語句 //或session.clear(foo1);Foofoo2=(Foo)session.get(Foo.class,1);//后續(xù)查詢System.out.println(foo2.getSalary());//SQL查詢語句 publicvoid SessionFoofoo1=(Foo)session.get(Foo.class,1);//不同的對象,所以查詢兩次Foofoo2=(Foo)session.get(Foo.class,2); publicvoid SessionFoofoo1=(Foo)session.get(Foo.class,1); Foofoo2=(Foo)session.get(Foo.class,1);//又一次查詢 延遲加載機制HibernateAPIHibernateAPI獲取一個對象結(jié)果后,該對象并沒有數(shù)getter方法獲取屬性值時,才去數(shù)據(jù)庫查詢加載。具有延遲加載機制的操作 id屬性(主鍵)有值,其他屬性數(shù)據(jù)在使用的時候(getXXX()getSQL)才去常犯的錯誤報錯:LazyInitializationException:couldnotinitialize 中使用了延遲加載操作,但是session在加載數(shù)據(jù)前關(guān)閉了。只要看到這個類名:LazyInitializationException就都是session過早關(guān)閉,后面的描述可能不同。Sessionsession=HibernateUtil.getSession(); Accountaccount1=(Account)session.get(Account.class,1010);//將account1放入緩存Accountaccount2=newAccount(); //updateaccont2Sessionsession=HibernateUtil.getSession(); Accountaccount1=(Account)session.get(Account.class,1010);//將account1放入緩存Accountaccount2=newAccount(); //updateaccont21010對id1010的對象 延遲加載的原理新生成的一個類型(動態(tài)的在內(nèi)存中生成。在新類型中,將屬性的getter方法重寫。新生例如:例如:publicclassFoo$$EnhancerByCGLIB$$87e5f322extendsFoo{publicStringgetName(){ *.java*.class-->載入類加載器-->延遲加載:javassist.jar/cglib.jar(生成新類型)-->-->Sessiongetload方法的區(qū)別不同點:①get是立刻加載;load②get返回的對象類型是實體類型;load返回的是動態(tài)生成的一個類(動態(tài)nullload延遲加載的好處 2)可以使數(shù)據(jù)降低并發(fā)量案例:測試延遲加載publicvoidSession//load是延遲加載,fooFoofoo=(Foo)session.load(Foo.class,1);////session.close();//放這里報錯,session關(guān)的過早couldnotinitialize -noSessionSystem.out.println(foo.getName());//第一次調(diào)用屬性的getter方法時觸發(fā)查詢 publicvoidtest2(){ Sessionsession=HibernateUtil.getSession();Foofoo=(Foo)session.load(Foo.class,1);//此時還沒去數(shù)據(jù)庫查詢//類org.tarena.entity.Foo$$EnhancerByCGLIB$$87e5f322cglib.jar 案例:重構(gòu)NetCTOSS資費管理模塊step1Hibernate開發(fā)框架(jar包和主配置文件step2HibernateCOST_CHANGprivateIntegerid;//資費privateIntegerid;//資費ID privateStringname;//資費名稱NAMEprivateIntegerbaseDuration;//包 時長BASE_DURATIONprivateFloatbaseCost;//月固定費BASE_COSTprivateFloatunitCost;//單位費用UNIT_COSTprivateStringstatus12:暫停;STATUSprivateStringdescr;//資費信息說明DESCRprivateDatestartTime;//啟用日期STARTTIMEprivateDatecreaTime;//創(chuàng)建時間CREATIME ><!--<hibernate-<classname="ctoss.entity.Cost"table="COST_CHANG"<idname="id"<columnname="ID"<generator<param<propertyname="name"<columnname="NAME"<propertyname="baseDuration"<propertyname="baseCost"type="java.lang.Float"><!--<columnname="BASE_COST" 實體類和hbm.xml必須保持一致!列名寫錯則會報:不能實體類junitCopyTracestep32.3step6HibernateUtilstep4CostDAODAO TransactionCostcost=new publicList<Cost>findAll()throwsDAOException{Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Stringhql="from QueryListlist=query.list(); returnlist; publicList<Cost>findAll(intpage,introwsPerPage)throwsDAOException{Transactiontx=session.beginTransaction(); Stringhql="fromCost";Queryquery=session.createQuery(hql);intstart=(1)*rowsPerPage;//設(shè)置分頁查詢) returnlist; publicCostfindById(Integerid)throwsDAOException{SessionTransactionCostString return}publicCostfindByName(Stringname)throwsDAOException//select*fromCOST_CHANGwhereNAME=?Stringhql="fromCostwherename=?";Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Queryquery=session.createQuery(hql);query.setString(0,name);//Hibernate0 returncost; publicintgetTotalPages(introwsPerPage)throwsDAOException{//selectcount(*)fromStringhql="selectcount(*)fromCost";//類名Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Queryquery=session.createQuery(hql); inttotalRows=Integer.parseInt(obj.toString()); return}else{ return(totalRows/rowsPerPage)+1; publicvoidsave(Costcost)throwsDAOException{SessionTransactiontx=session.beginTransaction();//下面的設(shè)置屬性建議寫到Action中 publicvoidupdate(Costcost)throwsDAOException{Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();//ActionDAOupdatesetXX方法Costcost1=(Cost)session.get(Cost.class,cost.getId()); privatestaticprivatestaticCostDAOcostDAO=newJavaWeb程序中如何用延遲加載操作(OpenSessionInView)JavaWeb遲加載數(shù)據(jù))-->HTML頁面給瀏覽器。(把Session的關(guān)閉延View組件運行完之后,這種模式被稱為OpenSessionInView。3)OpenSessionInView和ThreadLocal:OpenSessionInViewSessionSession,SessionThreadLocal(keyMap<propertyHibernateSession<property①利用Struts2的器(將關(guān)閉session的操作寫在器中publicclassHibernateUtil{privatestaticSessionFactorypublicclassHibernateUtil{privatestaticSessionFactory器privatestaticThreadLocal<Session>sessionLocalnewThreadLocal<Session>();static{//不用每次都加載配置信息,所以放static塊中,否則耗費資源Configurationconf=newConfiguration();conf.configure("/hibernate.cfg.xml");//加載主配置hibernate.cfg.xmlsf=conf.buildSessionFactory();//獲取SessionFactory publicstaticSessiongetSession(){ Sessionsession=sessionLocal.get();session /**sessionpublicstaticvoidcloseSession(){ Sessionsession=sessionLocal.get(); session.close();//關(guān)閉session和釋放ThreadLocal空間 /**publicstaticvoidmain(String[]Sessionsession1=HibernateUtil.getSession();Sessionsession2= publicclassOpenSessionInViewInterceptorInterceptor{//publicStringpublicclassOpenSessionInViewInterceptorInterceptor{//publicStringintercept(ActionInvocationarg0)throwsException{Sessionsession=HibernateUtil.getSession();//開啟事務(wù),或Transactiontx=session.getTransaction(); Transactiontx=session.beginTransaction();//等于以上兩步try{arg0.invoke();//action、result //action return}catch(Exceptione){ tx.rollback();//回滾事務(wù)System.out.println("回滾事務(wù)"); throwe;// Interceptor類影響,必須拋常}finally{HibernateUtil.closeSession();// }}-->AddCostAction-->器開啟事務(wù)-->ListCostAction-->cost_list.jsp-->器<interceptorstep3:在NetCTOSS項目中的struts-cost.xml中配置<interceptor<interceptor-stack<interceptor-refname="defaultStack"></interceptor- <!--定義全 ,若其他配置文件也有全 器,則覆蓋原來的,找最的step45.16step4HibernateCostDAOImpl類里的所有方法中的Session全部刪除。publicvoidpublicvoidchain.doFilter(request,response);//action,result}SpringAOP六、關(guān)聯(lián)映射AccountaccountAccount)session.get(Account.classAccountaccountAccount)session.get(Account.class1);//取到用戶信息Stringhql="fromServiceswheres.accountId=1";Queryquerysession.createQuery(hql);//取到用戶對應(yīng)的服務(wù)List<Item>list=query.list();Hibernate一對多關(guān)系one-to-hibernate.cfg.xmlhbm.xml映射文件。ServiceprivateServiceprivateSet<Service>services=newstep3OneAccount.hbm.xmlSet節(jié)點的映射<set<setname="屬性名<!--關(guān)聯(lián)條件,columnACCOUNT<keycolumn="指定關(guān)聯(lián)條件的外鍵字段<!--指定采用一對多關(guān)系,class<one-to-manyclass="要關(guān)聯(lián)的另一方(N方<!--<!--servicesservice<!--是list集合用<list set集合用<set <set<keycolumn="ACCOUNT_ID"></key><!ACCOUNT_IDService<one-to-manystep45.174)step1HibernateUtilpublicvoidpublicvoidSessionAccountaccount=(Account)session.load(Account.class1011);//SQL/**ServiceStringhql="fromServicewhereACCOUND_ID=1011";hqlSet<Serviceservices=account.getServices();//SQLfor(ServiceSystem.out.println(s.getId()+"System.out.println(s.getId()+""+s.getOsUsername()+" 多對一關(guān)系many-to-hibernate.cfg.xmlhbm.xml映射文件。AccountprivateAccountAccountprivateAccountaccount;//accountIdaccountId錯的映射文件對應(yīng)的描述也刪!否則報錯:org.hibernate.MapException:Repeatedcolumninmapforentity:org.tarena.entity.Servicecolumn:ACCOUNT_ID<many-to-onename="<many-to-onename="屬性名"class="要關(guān)聯(lián)的另一方類型Account" <!--指明外鍵字段,不寫主鍵-->注意事項:此時沒有<setname="屬性名"></set> <!--<!--account<many-to-onename="account"class="org.tarena.entity.Account" <!--指明外鍵字段,不寫主鍵-->step45.174)step1HibernateUtilpublicvoidpublicvoidSessionServiceservice=(Service)session.load(Service.class,結(jié)果為啥 System.out.println(service.getAccount().getId());//第二次SQL查詢 }多對多關(guān)聯(lián)映射many-to-3答:Hibernate會自動的通過已經(jīng)映射的表,進行關(guān)系表操作。AA的數(shù)據(jù)則都被刪除!因此一般都6.4節(jié)。RoleprivateSet<Role>roles=newRoleprivateSet<Role>roles=newstep2Admin.hbm.xml中定義屬性的映射描述<set<setname="關(guān)聯(lián)屬性名table="中間的關(guān)系表<keycolumn="關(guān)系表中與當前一方關(guān)聯(lián)的字段<many-to-manyclass="關(guān)聯(lián)的另一方類型column="關(guān)系表中與另一方關(guān)聯(lián)的字段<!--<!--rolesRole<setname="roles"<key<many-to-manyclass="org.tarena.entity.Role"column="ROLE_ID"publicvoidtestFind(){//SessionAdminadmin=(Admin)session.get(Admin.class,1001); >for(Rolerole:roles){ System.out.println(role.getId()+""+role.getName());publicvoidtestAdd(){//}}Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Adminadmin=newAdmin(); admin.setName("常1"); ,}publicvoidtestDelete(){ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); adminprivateSet<Admin>admins=new2adminprivateSet<Admin>admins=newstep2Role.hbm.xml<!--<!--admin<setname="admins"<keycolumn="ROLE_ID"></key><!--admin.hbm.xml<many-to-manycolumn="ADMIN_ID"publicvoidtestFindRole(){//publicvoidtestFindRole(){//roleSessionsession=HibernateUtil.getSession(); System.out.println(role.getName());//ID1for(Adminadmin:role.getAdmins()){//adminSystem.out.println(admin.getId()+""+admin.getCode()+" 關(guān)聯(lián)操作(joinfetch/查詢操作getter方法時,會再發(fā)SQL查詢,可以采用下面的方法:①在hbm.xml關(guān)聯(lián)屬性映射描述中(下例是在Account.hbm.xml中)<!--lazytrue<!--lazytruefalselazy屬性<!--<setname="serviceslazy="false"fetch="join">,lazy="false"關(guān)閉了延遲操作,與主對象一起實例化。fetchselectSQL查詢。joinSQL查HQL<setname="services"lazy="false"<keycolumn="ACCOUNT_ID"></key><!ACCOUNT_IDService<one-to-manyHQLjoinfetch(/**我們期望:當執(zhí)行(Account)session.get(Account.class,1001);語句,取出Account后,在屬性services已經(jīng)填充了所有的服務(wù)項service publicvoidtest1(){ Sessionsession=HibernateUtil.getSession();Accountaccount=(Account)session.get(Account.class,1011);>for(Services:services){System.out.println(s.getId()+""+s.getOsUsername()+""+s.getUnixHost());} @Test/**TestOneToManypublicvoidtest2(){Session//Stringhql="fromAccountwhereid=?";//TestOneToMany中test1//在下面的hqlhbm.xmlfetch的效果一樣Stringhql="fromAccountajoinfetcha.serviceswherea.id=?";//SQL查詢Queryquery=session.createQuery(hql);query.setInteger(0,1011); Accountaccount=(Account)query.uniqueResult();Set<Service>services=account.getServices();for(ServiceSystem.out.println(s.getId()+""+s.getOsUsername()+""+s.getUnixHost()); /**TestManyToOnepublicvoid SessionStringhql="fromServicesjoinfetchs.accountwheres.id=?";//SQLQueryquery=session.createQuery(hql);query.setInteger(0,2002);//Hibernate0開始Serviceservice=(Service)query.uniqueResult(); session.delete(account);services添加和更新④All:級聯(lián)添加、刪除、更新……等。案例:級聯(lián)增加:<setname="services"<setname="services"<key<one-to-manyAccountaccount=newAccount();//一個Account,簡單操作:只把非空列設(shè)置上 兩個Serviceservice2=newService();//同理/**serivce1service2account.servicesservice,同時Hibernate會檢測,新增數(shù)據(jù)若是services中的原有的,則不往數(shù)據(jù)庫添加*/ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction(); inverse默認情況下,采用了級聯(lián)操作,Hibernateinsert、update、deleted基本操作后還要執(zhí)行update關(guān)系字段的操(即關(guān)系工作上例中的為ACCOUNT_CHANGIDSERVICE_CHANGACCOUNT_ID即兩個update語句。如果數(shù)據(jù)量很大,則要N個Service,則有N個updata語句,此時updateAccount.hbm.xml例如:<setname="services例如:<setname="servicesinverse="true"注意事項:遇到一對多、多對一關(guān)系映射時,把inverse="true"屬性加到one-to-many一方(One方放棄,Many方。能起到一定的優(yōu)化作用。publicvoidpublicvoid/**Accountaccount=new 級聯(lián)刪除,不要newAccount()方法,因為new出來的account,它的services是空的,那么將是單表操 完整性約束*/Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Accountaccount=(Account)session.load(Account.class,500);//應(yīng)該先查找session.delete(account)再刪除 Hibernate的級聯(lián)刪除,簡單方便些。deletefromAccountwhere deletedeletefromAccountwhere deletefromServicewhereinverse="true"SERVICE_CHANG表中的ACCOUNT_ID=null,那么將與數(shù)據(jù)庫!報錯!所以,應(yīng)當加上繼承關(guān)系映射可以將數(shù)據(jù)表映射成具有繼承關(guān)系的實體類。Hibernate3<joined-subclassname="子類類型<joined-subclassname="子類類型table="子類表extends="父類類型<keycolumn="子類表與父類表關(guān)聯(lián)的字段//property CREATETABLEBOOK( WORD_NUMBERVARCHAR2(20),TOTAL_PAGEVARCHAR2(20) BRANDVARCHAR2(20),TYPEVARCHAR2(1),COLORVARCHAR2(50), CEMENT 有ID、名字、價格、產(chǎn)品。例如:publicclassBookextendsProduct{、publicclassCar例如:publicclassBookextendsProduct{、publicclassCarextendsProduct{ <idname="id"type="integer"<generatorclass="sequence"><!--指定序列<param<propertyname="name"type="string" ><!--BookProductname:指明當前子類。table:哪個表。extends<joined-subclassname="org.tarena.entity.Book"table="BOOK"<keycolumn="ID"></key><BOOKPRODUCT<!--Hibernate<propertyname="author"type="string" BookProduct<joined-subclassname="org.tarena.entity.Car"table="CAR"<keycolumn="ID"></key><!--CARPRODUCT<propertyname="brand"type="string"publicvoidpublicvoidSessionTransactiontx=session.beginTransaction();book.setName("常的書");//product屬性book.setAuthor("常");//book屬性session.save(book)執(zhí)行保存Bookbook=new}publicvoid SessionBookbook=(Book)session.load(Book.class,1);}publicvoid SessionTransactionTransactionBookbook=(Book)session.get(Book.class, publicvoidtestAddCar(){ Sessionsession=HibernateUtil.getSession();Transactiontx=session.beginTransaction();Carcar=newCar();//productsession.save(car)執(zhí)行保存publicvoidcar.setType("J");//JK}SessionStringhql="fromBook";//fromcar為所有汽車,fromproductQueryquery=session.createQuery(hql); List<Book>books=query.list();for(Bookbook:books){System.out.println(book.getId()+""+book.getName());} 七、Hibernate查詢方法HQL查詢HibernateQueryLanguageHQLHQL語句是面向?qū)ο蟮囊环N查詢語言。HQLHibernate映射之后的實體類型和屬HQLSQL的相同點select、from、where、groupby、orderby、havingin、notin、between...and、isnull、isnotnull、like、orHQLSQL的不同點HQL區(qū)分大小寫(除了關(guān)鍵字外HQLHQLselect*寫法。4)HQLjoin...onon子句。5)HQL不能使用數(shù)據(jù)庫端的函數(shù)。注意事項:HQLselectcount(*)HQL典型案例step1Account實體、Account.hbm.xml、hibernate.cfg.xml //SQL:select*frompublicvoidtest1(){//查詢所有賬務(wù)賬號信 Stringhql="fromSessionsession=HibernateUtil.getSession(); for(AccountSystem.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} //SQL:select*fromACCOUNT_CHANGwhereREAL_NAMElikepublicvoidtest2(){//按真名模糊查詢//andXXorStringhql="fromAccountwhererealNamelike//Stringhql="fromAccountwhererealNamelike:n";//方式二Sessionsession=HibernateUtil.getSession(); for(AccountSystem.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} //SQL:selectID,REAL_NAME,IDCARD_NOfromACCOUNT_CHANGpublicvoidtest3(){//查詢部分字段方式一Stringhql="selectid,realName,idcardNofromSessionsession=HibernateUtil.getSession(); /**Object[]屬性的個數(shù)、順序一致!注意事項:ObjectList<Object[]>for(Object[]objs:list){//AccountSystem.out.println(objs[0]+""+objs[1]+" //SQL:selectID,REAL_NAME,IDCARD_NOfromACCOUNT_CHANGpublicvoidtest4(){//查詢部分字段方式二Stringhql="selectnewAccount(id,realName,idcardNo)from/**Account實體中加構(gòu)造方法,無參的也加上(否則影響其他地方的使用?;蛘邔憘€新的實體類也可以。*/Sessionsession=HibernateUtil.getSession(); //AccountList<Account>for(Accounta:list){//注意:顯示其他屬性將會是初始值System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicpublicAccount(IntegerpublicpublicAccount(Integerid,StringrealName,String }step4Account.hbm.xmlHQL語句,step5<!--和class是平級的!一個 寫一個HQL語句--<queryname="findAll"><!--起個名字publicpublicvoidtest5(){//HQLhbm.xmlSession//session.getNamedQuery()hbm.xmlHQLQueryfor(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest6(){//Stringhql="fromAccount"; Sessionsession=HibernateUtil.getSession();Queryquery=session.createQuery(hql);,0for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} /**SQL:selectfromSERVICE_CHANGsjoinACCOUNT_CHANGaon(a.ID=s.ACCOUNT_ID*/publicvoidtest7(){//對象關(guān)聯(lián)查詢Stringhql="";//object//hql+="selects.id,s.osUsername,s.unixHost,a.realName,a.idcardNo;/**//hql+="fromServicesjoins.accountaon//hql+="fromAccountajoina.servicess沒有其他屬性,不能“.”出來*/hql+="selects.id,s.osUsername,s.unixHost,s.account.realName,s.account.idcardNo";hql+="fromServices";//因為不能寫on子句再加上Service中有account屬性所以關(guān)聯(lián)屬性寫s.accountSessionsession=HibernateUtil.getSession(); List<Object[]>for(Object[]objs:list){System.out.println(objs[0]+""+objs[1]+""+objs[2]+"+objs[3]+" (FIRST_NAMEVARCHAR2(20),LAST_NAME(FIRST_NAMEVARCHAR2(20),LAST_NAMEVARCHAR2(20),AGENUMBERADD實體,Hibernate//privateStringfirstName; private//privateStringfirstName; privateStringlastName; Keyid;//主屬性privateInteger ……get/set2)2)Key/**必須實現(xiàn)Serializable否則load、getSerializablepublic KeyimplementsprivateString privateString ……get/set方 <class<!--"<class<!--"<composite-idname="id" <!--<key-propertyname="firstName"type="string"<key-propertyname="lastName"type="string"<propertyname="age"type="integer"Criteria查詢CriteriaCriteriac=session.createCriteria(實體類 Listpublicvoidtest1(){//沒有任何子句 Sessionsession=HibernateUtil.getSession();Criteriac=session.createCriteria(Account.class); List<Account>list=c.list();for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());}publicvoidtest1(){//沒有任何子句 Sessionsession=HibernateUtil.getSession();Criteriac=session.createCriteria(Account.class); List<Account>list=c.list();for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest2(){//模糊查詢 Sessionsession=HibernateUtil.getSession();Criteriac=session.createCriteria(Account.class);//Criteriac1=session.createCriteria(Service.class);////Restrictionsc.add(Restrictions.like("realName","zhang%")); List<Account>list=c.list();for(Accounta:list){System.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} publicvoidtest3(){//SessionCriteriaCriteria//c.add(Restrictions.like("realName"zhang%")); Restrictions.like("realName", List<Account>for(AccountSystem.out.println(a.getId()+""+a.getRealName()+""+a.getIdcardNo());} NativeSQLSQL查詢SQLQuerySQLQueryHibernateSQL,極其復(fù)雜的SQL。publicvoidtest1(){//Stringpublicvoidtest1(){//Stringsql="select*fromACCOUNT_CHANG";Sessionsession=HibernateUtil.getSession();SQLQueryquery=session.createSQLQuery(sql); List<Object[]>list=query.list();for(Object[]objs:list){System.out.println(objs[0]+""+objs[1]+""+objs[2]);} publicvoidtest2(){//test1Stringsql="select*fromACCOUNT_CHANG";Sessionsession=HibernateUtil.getSession();SQLQueryquer

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論