




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第2章Hibernate入 運(yùn)行oapp應(yīng) 創(chuàng)建oapp應(yīng)用 把oapp應(yīng)用作為JavaWeb應(yīng)用運(yùn) 小 2Hibernate射。Hibernate封裝了通過(guò)JDBC數(shù)據(jù)庫(kù)的操作,向上層應(yīng)用提供了面向?qū)ο蟮臄?shù)據(jù)API。在Java應(yīng)用中使用Hibernate包含以下步驟。 oappHibernateoapp應(yīng)BusinessServiceHibernateoapp應(yīng)BusinessServiceHibernate對(duì)象-關(guān) 文CUSTOMERSCustomer圖2-1Hibernate在oapp應(yīng)用中所處的位oapp應(yīng)用既能作為獨(dú)立的Java程序運(yùn)行,還能作為JavaWeb應(yīng)用運(yùn)行,該應(yīng)用的源代碼位于配套光盤的sourcecode/chapter2/ Hibernate從其配置文件中和數(shù)據(jù)庫(kù)連接有關(guān)的信息,這個(gè)配置文件應(yīng)該位于應(yīng)用classpath中。HibernateXML格式的文件;還有一種是Java屬性文件,采用“健=值”的形式。認(rèn)文件名為perties,例程2-1為示范代碼。例程2-1 MySQL2-1perties2-1Hibernate配置文件的屬屬描指定數(shù)據(jù)庫(kù)使用的SQL指定數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程指定連接數(shù)據(jù)庫(kù)的指定連接數(shù)據(jù)庫(kù)的口如果為true,表示在程序運(yùn)行時(shí),會(huì)在控制臺(tái)輸出SQL語(yǔ)句,這有利于的運(yùn)行狀態(tài)。默認(rèn)為false。在應(yīng)用開發(fā)和測(cè)試階段,可以把這個(gè)屬性設(shè)為true和調(diào)試應(yīng)用程序,在應(yīng)用發(fā)布階段,應(yīng)該把這個(gè)屬性設(shè)為 alse,以便減少應(yīng)用的輸出信息,提高運(yùn)行性能。SQLHibernateSQLnative對(duì)象標(biāo)識(shí)符生成策略時(shí),在Hibernate軟件包的etc 下,有一個(gè)perties文件,Hibernate持久化到數(shù)據(jù)庫(kù)中的類。持久化類通常都是域模和setXXX()方法。例程2-2定義了一個(gè)名為Customer的持久化類。例程2-2packageimportjava.io.Serializable;importjava.sql.Date;importjava.sql.Timestamp;publicclassCustomerimplementsSerializable{privaongid;privateStringname;privateString;privateStringpassword;privateintphone;privatebooleanmarried;privateStringaddress;privatecharsex;privateStringdescription;privatebyte[]image;privateDatebirthday;privateTimestamppublicpublicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicgetName(){return}publicvoidsetName(Stringname){}//此處省略、password和phone等屬性的getXXX()和setXXX()方}持久化類符合JavaBean的規(guī)范,包含一些屬性,以及與之對(duì)應(yīng)的getXXX()setXXX()方法寫為getname()或者getNAME(),會(huì)導(dǎo)致Hibernate在運(yùn)行時(shí)拋出以下異常:net.sf.hibernate.PropertyNotFoundException:Couldnotfindagetterforpropertynameinclassmypack.Customer也可以用“isCustomermarriedboolean類型,因此以下兩種get方法是等價(jià)的:publicisMarried(){return}或publicgetMarried(){return}JavaJava對(duì)象在不同的進(jìn)程節(jié)點(diǎn)之間傳輸時(shí),這個(gè)對(duì)象所屬的類必須實(shí)現(xiàn)行持久化,那么這個(gè)Java對(duì)象所屬的類也必須實(shí)現(xiàn)Serializable接口。IdentifiercustomerA.getId().equals(customerB.getId())true,customerAcustomerBCUSTOMERS表中的同一Hibernate要求持久化類必須提供一個(gè)不帶參數(shù)的默認(rèn)構(gòu)造方法,在程序運(yùn)行時(shí),Hibernate能夠在運(yùn)行時(shí)為這個(gè)持久化類創(chuàng)建動(dòng)態(tài),要求持久化類的默認(rèn)構(gòu)造方法的級(jí)別必須是public或protecteddefaultprivate10章(Hibernate的檢索策略)介紹了Hibernate的延遲檢索策略以及動(dòng)態(tài)的概念。1章介紹J2EE的持久化方案CMP的實(shí)EJB,還BMP的實(shí)EJB,它們的共同特點(diǎn)是都必須運(yùn)行在EJB容器中。而Hibernate支持的持久化類不過(guò)是普通的Java類,它們能夠運(yùn)行在任何一種Java環(huán)境中。的DDL定義如下:createtableCUSTOMERSIDbigintnotnullprimarykey,NAMEvarchar(15)notnull,varchar(128)notnull,PASSWORDvarchar(8)notnull,PHONEint,SEXchar(1),IS_MARRIEDbit,DESCRIPTIONtext,IMAGEblob,CUSTOMERSIDCustomerid2-2CUSTOMERS表的字段使用的SQLSQL說(shuō)整數(shù),占8字節(jié),取值范圍為:-2^63~2^63變長(zhǎng)字符串0~255個(gè)字定長(zhǎng)字符串0~255個(gè)字長(zhǎng)文本數(shù)據(jù)0~65535字節(jié)。如果字符串長(zhǎng)度小于255,可以VARCHARCHAR類型來(lái)表示。如果字符串長(zhǎng)度255,可以定義為TEXT類型。二進(jìn)制長(zhǎng)數(shù)據(jù),占0~65535字節(jié),BLOBBinaryLargeObject的縮寫在本例中,IMAGE字段用來(lái)存放數(shù)代表日期,格式為“YYYY-MM-創(chuàng)建對(duì)象-關(guān)系文將根據(jù)這個(gè)文件來(lái)生成各種SQL語(yǔ)句。在本例中,將創(chuàng)建一個(gè)名為Customer.hbm.xml件存放在同一個(gè)下。例程2-3Customer.hbm.xml文件的代碼。例程2-3<?xml<!DOCTYPEhibernate-mapPUBLIC"-//Hibernate/HibernateMapDTD2.0//EN"""><idname="id"column="ID"<generator<property column="NAME"type="string"not-null="true" type="string"not-null="true"<propertyname="password"column="PASSWORD"type="string"not-<property type="int"<property type="string"<property <property column="IS_MARRIED"<propertyname="description"column="DESCRIPTION"<property <property <propertyname="registeredTime"column="REGISTERED_TIME" 文件的文檔類型定義在例程2-3的Customer.hbm.xml文件的開頭了DTD( TypeDefinition,文每一種XML文件都有獨(dú)自的DTD文件。Hibernate的對(duì)象-關(guān)系文件使用的文件 為:。此外,Hibernate軟件包的src\net\sf\hibernate <!ELEMENThibernate-map(meta*,import*,(class|subclass|joined-subclass)*,query*,( <hibernate-map>元素是對(duì)象-關(guān)系文件的根元素,其他元素(即以上DTD代碼表2-3描述了這些符號(hào)的作用。在創(chuàng)建自己的對(duì)象-關(guān)系文件時(shí),如果不熟悉某種元素的語(yǔ)法,可以參考DTD文件。2-3DTD符含該子元素在父元素內(nèi)必須存在+該子元素在父元素內(nèi)必須存在*該子元素在父元素內(nèi)可以不存在,或者存在一次或者多次。它是比較常用的符號(hào)?該子元素在父元素內(nèi)可以不存在,或者只存在一次。它是比較常根據(jù)表2-3可以看出,在<hibernate-map>元素中,<meta>、<import>、<class><property column="NAME"type="string"not-null="true" type="string"not-null="true"<idname="id"column="ID"<generator[java]21:27:51,610ERRORXMLHelper:48-ErrorparsingXMLInputStream(24)Thecontentofelementtype"class"mustmatch"(meta*,(cache|jcs- [java]net.sf.hibernate.MapException:Errorreadingresource:mypack/Customer.hbm.xmlatnet.sf.hibernate.cfg.Configuration.addClass(Configuration.java:357)把Customer持久化類到CUSTOMERS碼表明和Customer類對(duì)應(yīng)的表為CUSTOMERS表:<classname="mypack.Customer"默認(rèn)情況下,與mypack.Customer類對(duì)應(yīng)的表為Customer表。<idname="id"column="ID"<generatortype、columnnot-null屬性。SQL類型的橋梁。表2-4列出了Customer類的屬性的Java類型、Hibernate類型以及CUSTOMERS表的字段的SQL類型這三者之間的對(duì)應(yīng)關(guān)系。表2-4Java類型、Hibernate類型以及SQL類型之間的對(duì)應(yīng)關(guān)CustomerJava類CUSTOMERSSQL從表2-4看出,如果Customer類的屬性為java.lang.String類型,并且與此對(duì)應(yīng)的<propertyname="name"column="NAME"type="string"not-null="true"段為TEXT類型,那么應(yīng)該把Hibernate類型設(shè)為text,例如:<propertyname="description"column="DESCRIPTION"<propertyname="image" 如果沒有顯式設(shè)定類型,Hibernate會(huì)運(yùn)用Java反射機(jī)制先識(shí)別出持久化類的屬性的Java類型,然后自動(dòng)使用與之對(duì)應(yīng)的默認(rèn)的Hibernate類型。例如,Customer類的<propertyname="address"或<propertyname="address"type="string"3.<property>元素的not-null屬性<propertyname="name"column="NAME"type="string"not-null="true"HibernateCustomernamenull,如果null,就會(huì)拋出以下異常:net.sf.hibernate.PropertyValueException:not-nullpropertyreferencesanullortransientvalue:mypack.Cnot-null<propertyname="name"column="NAME"type="string"而是直接通過(guò)JDBCAPI向CUSTOMERS表相應(yīng)的數(shù)據(jù),由于CUSTOMERS表的NAME字段設(shè)置了notnull約束,因此數(shù)據(jù)庫(kù)會(huì)拋出錯(cuò)誤:708ERRORJDBCExceptionReporter:58-Generalerror,messagefromserver:"Column'NAME'cannotbenull"例如對(duì)于Customer對(duì)象的name屬性,事實(shí)上在表述層就能檢查name屬性是否為null,假層會(huì)監(jiān)測(cè)到NAME字段了數(shù)據(jù)完整性約束,從而拋出異常,如圖2-2所示,包含Customer對(duì)(name屬Customer對(duì)(name屬性為數(shù)據(jù)庫(kù)2-2<property>元素的column屬性指定與類的屬性的表的字段名。以下代碼表明<propertyname="address"column="ADDRESS"名,也就是說(shuō),默認(rèn)情況下,與Customeraddress屬性對(duì)應(yīng)的字段為address字段。<propertyname="address"column="ADDRESS"或<propertyname="address"<columnname="ADDRESS"<property>元素的<column>子元素比column屬性提供的功能,它可以更加詳細(xì)的型為varchar(15),不允許為null,并且為這個(gè)字段建立了索引:<propertyname="name"<columnname="NAME"sql-type="varchar(15)"not-null="true"index="idx_name"<column>hbm2ddlhbm2ddl工具來(lái)自動(dòng)生成數(shù)據(jù)庫(kù)Schema時(shí),hbm2ddl工具將依據(jù)<column>子元素提供的信息來(lái)定義表的字段。關(guān)于hbm2ddl3章(hbm2javahbm2ddl工具Schema是的name屬性和not-null屬性就可以了,例如:<propertyname="name"<columnname="NAME"not-null="true"或<propertyname="name"column="NAME"type="string"not-null="true"not-null屬性以外,<column>子元素的多數(shù)屬性(sql-typeindex屬性)都不會(huì)影響Hibernate的運(yùn)行時(shí)行為。ID字段NAME字PASSWORD字字CUSTOMERSid屬性ID字段NAME字PASSWORD字字CUSTOMERSid屬性name屬性屬Customer2-3Customer.hbm.xml配置的接通過(guò)JDBCAPI以及通過(guò)HibernateAPI來(lái)數(shù)據(jù)庫(kù)的兩種方式。JDBCJava應(yīng)JDBCHibernateJava應(yīng)圖2-4通過(guò)JDBCAPI數(shù)據(jù) 圖2-5通過(guò)HibernateAPI數(shù)據(jù)HibernateAPI例程2-4packagemypack;importimportnet.sf.hibernate.cfg.Configuration;importjava.io.*;importjava.sql.Date;importjava.util.*;publicclasspublicstaticSessionFactory/**Hibernate,創(chuàng)建SessionFactory實(shí)例*///根據(jù)默認(rèn)位置的Hibernate配置文件的配置信息,創(chuàng)建一個(gè)Configuration實(shí)Configurationconfig=newConfiguration();//創(chuàng)建SessionFactory實(shí)例*/sessionFactoryconfig.buildSessionFactory();}catch(Exception}/**CustomerprintCustomer()方法打印Customer對(duì)象信息*/publicvoidfindAllCustomers(ServletContextcontext,OutputStreamoutthrowsException/**Customer對(duì)象publicvoidsaveCustomer(Customercustomer)throwsException{……/**OID加載一個(gè)Customer對(duì)象,然后修改它的屬性publicvoidloadAndUpdateCustomer(Longcustomer_id,Stringaddress)throws/**Customer對(duì)象*/publicvoiddeleteAllCustomersthrowsException{Sessionsession=sessionFactory.openSession();Transactiontx=null;try{tx=session.beginTransaction();session.delete("fromCustomerasc");}catch(Exceptione)if(tx!={}throw}{}}/**選擇向控制臺(tái)還是頁(yè)輸出Customer對(duì)象的信息privatevoidprintCustomer(ServletContextcontext,OutputStreamout,Customercustomer)throwsException{if(outinstanceofServletOutputStream)}
printCustomer((PrintStream)/**把CustomerDOS控制臺(tái)privatevoidprintCustomer(PrintStreamout,Customercustomer)throwsException{……/**把Customer對(duì)象的信息輸出到頁(yè)privatevoidprintCustomer(ServletContextcontext,ServletOutputStreamout,Customercustomer)throwsException{……}publicvoidtest(ServletContextcontext,OutputStreamout)throwsException{Customercustomer=newCustomer(); customer.setDescription("Iamveryhonest.");//設(shè)置Customer對(duì)象的imagephoto.gif//photo.gifBusinessService.class文件位于同一個(gè)下InputStreamin=this.getClass().getResourceAsStream("photo.gif");byte[]buffer=newbyte[in.available()];//設(shè)置Customer對(duì)象birthday屬性,它是java.sql.Date類}publicstaticvoidmain(Stringargs[])throws{newBusinessService().test(null,System.out);}}以上例子演示了通過(guò)HibernateAPI數(shù)據(jù)庫(kù)的一般流程。首先應(yīng)該在應(yīng)用的啟動(dòng)階段對(duì)Hibernate進(jìn)行初始化,然后就可以通過(guò)Hibernate的Session接口來(lái)數(shù)據(jù)庫(kù)。BusinessService類的靜態(tài)代碼塊負(fù)責(zé)Hibernate的初始化工作,如Hibernate的配置信息以及對(duì)象-關(guān)系信息,最后創(chuàng)建SessionFactory實(shí)例。當(dāng)JVM(Java虛擬機(jī))加載BusinessService類時(shí),會(huì)執(zhí)行該靜態(tài)代碼塊。初始化過(guò)程包括如下步驟。Configuration類的實(shí)例,Configuration類的構(gòu)造方法把默認(rèn)文件路徑下的perties配置文件中的配置信息讀入到內(nèi)存:Configurationconfig=newsessionFactory=數(shù)據(jù)庫(kù)源,那么只需創(chuàng)建一個(gè)SessionFactory實(shí)例。當(dāng)SessionFactory對(duì)象創(chuàng)建后,該ConfigurationConfiguration對(duì)象包含的配置信息,不會(huì)對(duì)SessionFactory對(duì)象有任何影響。由于Java語(yǔ)言是純面向?qū)ο蟮恼Z(yǔ)言,因此不可能象C語(yǔ)言那樣直接內(nèi)存,例如聲明一段可用的內(nèi)存空間。以上步驟(3)中提到了緩存的概念,這里的緩存其實(shí)指的是Java對(duì)象的屬性(通常是一些集合類型的屬性)SessionFactory的實(shí)現(xiàn)類publicfinalclassSessionFactoryImplimplementsSessionFactory,{privatefinaltransientMapclassPersisters;privatefinaltransientMapclassPersistersByName;privatefinaltransientMapclassMetadata;privatefinaltransientMapcollectionPersisters;privatefinaltransientMapcollectionMetadata;privatefinaltransientMapnamedQueries;privatefinaltransientMapnamedSqlQueries;privatefinaltransientMapimports;privatefinaltransientTemplatestemplates;privatefinaltransientInterceptorinterceptor;privatefinaltransientSettingssettings;privatefinaltransientPropertiesproperties;privatetransientSchemaExportprivatefinaltransientTransactionManagertransactionManager;privatefinaltransientQueryCachequeryCache;privatefinaltransientUpdateTimestampsCacheupdateTimestampsCache;privatefinaltransientMapqueryCaches;}級(jí)對(duì)象。SessionFactory就是個(gè)重量級(jí)對(duì)象,如果應(yīng)用只有一個(gè)數(shù)據(jù)源,只需創(chuàng)建一個(gè)SessionFactory實(shí)例,因?yàn)殡S意的創(chuàng)建SessionFactory實(shí)例會(huì)占用大量?jī)?nèi)存空間。SessionFactory的緩存可分為兩類:內(nèi)置緩存和外置緩存。SessionFactory的內(nèi)置緩存中存放了Hibernate配置信息和元數(shù)據(jù)信息等;SessionFactory的外置緩存是一個(gè)可配置的緩存插件,默認(rèn)情況下,拷貝,外置緩存的物理介質(zhì)可以是內(nèi)存或者硬盤。本書第13章(管理Hibernate的緩存)對(duì)此作了詳細(xì)介紹?;禺?dāng)前Configuration實(shí)例,因此對(duì)于以下代碼:Configurationconfig=newConfiguration();sessionFactory=newHibernate的Session接口Session實(shí)例。如果事務(wù)執(zhí)行中出現(xiàn)異Sessionsession=factory.openSession();Transactiontx;trytx=}catch(Exceptione)if(tx!=null)tx.rollback();throwe;}finally//務(wù)執(zhí)行成功與否,最后都關(guān)閉Session}1:1:2:3:call4:5:2-6BusinessService類提供了保存、刪除、查詢和更新Customer對(duì)象的各種方法。tx=session.beginTransaction();insertintoCUSTOMERS(ID,NAME, ,PASSWORD,PHONE,ADDRESS,SEX,IS_MARRIED,DESCRIPTION,IMAGE,BIRTHDAY,REGISTERED_TIME) <idname="id"column="ID"<generator中,REGISTERED_TIMEnullREGISTERED_TIMESQL類型TIMESTAMPinsertTIMESTAMP類型的字段賦值,底層數(shù)據(jù)庫(kù)REGISTERED_TIME字段的值并不為null,而是該記錄時(shí)的系統(tǒng)時(shí)間。tx=Listcustomers=session.find("fromCasc");for(Iteratorit=customers.iterator();it.hasNext();){printCustomer(context,out,(Customer)}執(zhí)行以下SQL語(yǔ)句:select*fromCUSTOMERSorderbyNAMEtx=Customerc=(Customer)session.load(Customer.class,customer_id);Customer對(duì)象,HibernateSQL語(yǔ)句:select*fromCUSTOMERSwhereloadAndUpdateCustomer()Customeraddress屬性。那么,HibernateCUSTOMERS表的記錄呢?答案是肯定的。Hibernate采用Hibernate會(huì)執(zhí)行以下SQL語(yǔ)句:updateCUSTOMERSset where法時(shí),Sessionsave()customer對(duì)象持久化到數(shù)據(jù)庫(kù)中,并自動(dòng)為id屬性賦值。Customer對(duì)象的信息,它有三種重載形式。當(dāng)oapp應(yīng)用作為獨(dú)立應(yīng)用printCustomer(PrintStreamout,Customercustomer)方法,向控制臺(tái)輸出Customer信息;當(dāng)oappJavaWeb應(yīng)用運(yùn)行時(shí),將調(diào)用printCustomer(ServletContextcontext,ServletOuputStreamout,Customercustomer)Web客戶輸出Customer信息:privatevoidprintCustomer(ServletContextcontext,ServletOutputStreamCustomercustomer)throws//把Customer對(duì)象的image屬性包含的二進(jìn)制數(shù)據(jù)保存到photo_copy.gif文件byte[]buffer=customer.getImage();FileOutputStreamfout=newFileOutputStream(path+"photo_copy.gif"); out.println("IDcustomer.getId()+"<br>");out.println(":"+customer.get()+"<br>");out.println(":"+customer.getPhone()+"<br>");out.println("地址customer.getAddress()+"<br>");Stringsex=customer.getSex()=='M'?"男":"女";out.println(":"+sex+"<br>");StringmarriedStatus=customer.isMarried已婚":"未婚";out.println("狀況:"+marriedStatus+"<br>");out.println("生日customer.getBirthday()+"<br>");out.println("時(shí)間:"+customer.getRegisteredTime()+"<br>");'}tx=session.beginTransaction();session.delete("fromCustomerasc");Language是一種面向?qū)ο蟮恼Z(yǔ)言,“fromCustomerascCustomer類的名字,而非Customerselect*fromdeletefromCUSTOMERSwhereoappJavaJavaWeb應(yīng)用來(lái)運(yùn)行。當(dāng)作BusinessServicemain()JavaWeb應(yīng)用,需要在JavaWeb服務(wù)器上才能運(yùn)行,本書采用Tomcat服務(wù)器。:與Struts框架)需要用到它。表2-5列出了以上軟件的。此外,本書配套光盤的software 上軟件(不包括JDK軟件2-5軟JDKMySQL的安裝軟件是可運(yùn)行程序,只需直接MySQL5.xMySQL的過(guò)程中,會(huì)出現(xiàn)為“root”用戶輸令的窗口,在該窗口中設(shè)置口令為“12342-7MySQL2-7設(shè)置MySQL的“rootMySQL目前最成版本為41,但是該版本不支持SQL子查詢語(yǔ)句,MySQL的版本5.0提供了這能,不過(guò)該版本還處于測(cè)試階段。本MySQL5.0的測(cè)試版本,選用這個(gè)版本,是為了便于演示Hibernate的各種高級(jí)功能。PATH%JAVA_HOME%/binPATH變量中,以便于在當(dāng)前路徑下,DOSJDKjavacjava命令;把%ANT_HOME%/bin添加到PATH變量中,以便于在當(dāng)前路徑下,從DOS命令行直接運(yùn)行ANT。問,如果Tomcat啟動(dòng)成功,可看到Tomcat的主頁(yè)。 的 可以按以下步驟把MySQL作為服務(wù)運(yùn)行: 的bin -- 過(guò)的MySQL服務(wù)。NT/Win2000MySQLMySQLServer5.0】→【MySQLCommandLineClientMySQLmysql.exe,參見圖2-8,該客戶程序先提示輸入root用戶的口令,此處應(yīng)該輸令“1234”,即rootDOSmysql.exe程序,步驟為先轉(zhuǎn)到MySQL安裝的bin下,輸入如下命令:C:\mysql\bin>mysql–uroot-接下來(lái)會(huì)提示輸入root用戶的口令,此處輸令“1234Enterpassword:createdatabaseusecreatetableCUSTOMERSIDbigintnotnullprimarykey,NAMEvarchar(15)notnull,varchar(128)notnull,PASSWORDvarchar(8)notnull,PHONEint,SEXchar(1),IS_MARRIEDbit,DESCRIPTIONtext,IMAGEblob,2-8MySQL在配套光盤的sourcecode/chapter2/oapp/schema下提供了創(chuàng)建SAMPLEDB數(shù)據(jù)庫(kù)和CUSTOMERS表的SQL文件,文件名為sampledb.sql。如果不想在MySQL.exe程序中SQL語(yǔ)句,也可以直接sampledb.sql,步驟為先轉(zhuǎn)MySQL安裝的bin下,輸入如下命令:C:\mysql\bin>mysql–uroot–p<C:\接下來(lái)會(huì)提示輸入root用戶的口令,此處輸令“1234Enterpassword: 本書提供 oapp應(yīng)用采用JavaWeb應(yīng)用的標(biāo) 結(jié)構(gòu)。當(dāng)應(yīng)用中使用 在WEB-INF/classes下添加對(duì)象-關(guān)系文件,默認(rèn)情況下,存放位置和相應(yīng)的類文件在同一個(gè)位置。例如在本例中,Customer.class和Customer.hbm.xml均位于WEB-INF/classes/mypack下。WEB-INF/libJDBCJARWEB-INF/lib下添HibernateJARHibernate根hibernate2.jar文件以及l(fā)ib子下的所有JAR文件拷貝到oapp應(yīng)用的WEB-INF/lib下。 HpertiesHperties文perties文web.xmlo.jspWEB-oappCustomer.hbm.xml文Customer.hbm.xml文件Customer.java文件BusinessService.java文件DBServlet.java文件photo.gif文件圖2- oapp應(yīng)用的初 在圖2-9的src 下還有一個(gè)perties文件它是Log4J的配置文件。Log4j是由Apache開放源代碼組織開發(fā)的日志,它的為:。在Hibernate中集成src子用于存放Java源文件、pertiesCustomer.hbm.xml文件。接ANTclasses子,把pertiesCustomer.hbm.xml文件拷貝到classes下,編譯生成的類文件也放在classes下。 下有一個(gè)build.xml文件,它是ANT的工程文件,參見例2-5例程2-5<?xml<projectname="LearningHibernate"default="prepare"<!--Setuppropertiescontainingimportantprojectdirectories--<propertyname="lib.dir"value="WEB-<!--Setuptheclasspathforcompilationandexecution--<path<!--Includeourownclasses,ofcourse--<pathelementlocation="${class.root}"<!--Includejarsintheprojectlibrarydirectory--<fileset<include<!--Createourruntimesubdirectoriesandcopyresourcesintothem--<name="prepare"description="Setsupbuild<delete<mkdir<!--CopyourpropertyfilesandO/Rmapsforuseatruntime--<filesetdir="${source.root}"<include<include<include<include<!--Compilethejavasourceoftheproject--<name="compile"depends="prepare"description="CompilesallJavaclasses"><javacsrcdir="${source.root}"<classpath<name="run"description="RunaHibernatesample"<classpath<propertyname="lib.dir"value="WEB-指定所有JAR文件的路徑。prepare:如果存在classes子,先將它刪除。接著重新創(chuàng)建classes子。的文件拷貝到WEB-INF/classes下。compile:編譯src 當(dāng)運(yùn)行run時(shí),會(huì)依次執(zhí)行prepare pile和pilecompilepreparerun圖2-10build.xml文件中三個(gè)的依賴關(guān) (2)在MySQL服務(wù)器中安裝oapp應(yīng)用的數(shù)據(jù)庫(kù)。創(chuàng)建數(shù)據(jù)庫(kù)的為schema/sampledb.sql。在MySQL中運(yùn)行該,它負(fù)責(zé)創(chuàng)建SAMPLEDB數(shù)據(jù)庫(kù),然后在該數(shù)據(jù)庫(kù)中創(chuàng)建CUSTOMERS表。 oapp ant以上命令將依次執(zhí)行 pile和run,run運(yùn)[java]Hibernate:insertintoCUSTOMERS(NAME, ,PASSWORD,PHONE,ADDRESS,SEX,IS_MARRIED,DESCRIPTION,IMAGE,BIRTHDAY,REGISTERED_TIME,ID)values(?,?,?,?,?,?,?,?,?,?,?,?)[java]Hibernate:selectcustomer0_.IDasID,customer0_.NAMEasNAME, ,customer0_.PASSWORDasPASSWORD,customer0_.PHONEasPHONE,customer0_.ADDRESSasADDRESS,customer0_.SEXasSEX,customer0_.IS_MARRIEDasIS_MARRIED,customer0_.DESCRIPTIONasDESCRIPT9_,customer0_.IMAGEasIMAGE,customer0_.BIRTHDAYasBIRTHDAY,customer0_.REGISTERED_TIMEasREGISTE12_fromCUSTOMERScustomer0_orderbycustomer0_.NAMEasc[java]ID:1[java]口令1234[java]:[java]:[java]地址Shanghai[java]:男[java]狀況:未[java]生日1980-05-[java]時(shí)間:2005-03-15[java]自我介紹Iamvery[java]Hibernate:selectcustomer0_.IDasID0_,customer0_.NAMEas 0_,customer0_.PASSWORDasPASSWORD0_,customer0_.PHONEasPHONE0_,customer0_.ADDRESSasADDRESS0_,customer0_.SEXasSEX0_,customer0.IMAGEasIMAGE0_,customer0_.BIRTHDAYasBIRTHDAY0_,customer0_.REGISTERED_TIMEasREGISTE12_0_fromCUSTOMERScustomer0_wherecustomer0_.ID=?[java]Hibernate:updateCUSTOMERSset =?,PASSWORD=?,,ADDRESS=?,SEX=?,IS_MARRIED=?,DESCRIPTION=?,IMAGE=?,BIRTHDAY=?,REGISTERED_TIME=?whereID=?[java]Hibernate:selectcustomer0_.IDasID,customer0_.NAMEasNAME, ,customer0_.PASSWORDasPASSWORD,customer0_.PHONEasPHONE,customer0_.ADDRESSasADDRESS,customer0_.SEXasSEX,customer0_.IS_MARRIEDasIS_MARRIED,customer0_.DESCRIPTIONasDESCRIPT9_,customer0_.IMAGEasIMAGE,customer0_.BIRTHDAYasBIRTHDAY,customer0_.REGISTERED_TIMEasREGISTE12_fromCUSTOMERScustomer0_orderbycustomer0_.NAMEasc[java]ID:1[java]口令:1234 [java]:[java]地址Beijing[java]:男[java]狀況:未[java]生日1980-05-[java]時(shí)間:2005-03-15[java]自我介紹Iamvery[java]Hibernate:selectcustomer0_.IDasID,customer0_.NAMEasNAME, ,customer0_.PASSWORDasPASSWORD,customer0_.PHONEasPHONE,customer0_.ADDRESSasADDRESS,customer0_.SEXasSEX,customer0_.IS_MARRIEDasIS_MARRIED,customer0_.DESCRIPTIONasDESCRIPT9_,customer0_.IMAGEasIMAGE,customer0_.BIRTHDAYasBIRTHDAY,customer0_.REGISTERED_TIMEasREGISTE12_fromCUSTOMERScustomer0_[java]Hibernate:deletefromCUSTOMERSwhere由于perties文件的show_sql屬性為true,因此Hibernate把運(yùn)行時(shí)執(zhí)行的SQLsession.find("fromCasc")方法時(shí),Hibernate執(zhí)行的SQL語(yǔ)句為:selectcustomer0_.IDasID,customer0_.NAMEasNAME,customer0_. customer0_.PASSWORDasPASSWORD,customer0_.PHONEasPHONE,customer0_.ADDRESSasADDRESS,customer0_.SEXasSEX,customer0_.IS_MARRIEDasIS_MARRIED,customer0_.DESCRIPTIONasDESCRIPT
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)村個(gè)體農(nóng)場(chǎng)經(jīng)營(yíng)合同范本
- 包料裝修合同范本
- 人流手術(shù)合同范本
- 2024年全國(guó)特崗教師招聘考試真題
- 2024年欽州市遴選公務(wù)員考試真題
- 2024年臺(tái)州溫嶺市中醫(yī)院招聘員工筆試真題
- 出售隔斷酒柜合同范本
- 個(gè)人房屋擔(dān)保合同范本
- 光伏清洗施工合同范例
- 2024年保山市智源高級(jí)中學(xué)招聘教師考試真題
- 新媒體導(dǎo)論彭蘭課件
- 安全生產(chǎn)管理制度匯編(一般化工企業(yè))
- 第4周-2023-2024學(xué)年人教版數(shù)學(xué)七年級(jí)上冊(cè)周周練(含答案)
- 公務(wù)員考試申論試題與參考答案(2025年)
- 《呼吸囊的使用》課件
- 公共體育場(chǎng)館物業(yè)管理服務(wù)方案
- DB41T 2599-2024 煤礦地震監(jiān)測(cè)站網(wǎng)技術(shù)規(guī)范
- 小孩進(jìn)入廠區(qū)安全免責(zé)協(xié)議書(2篇)
- 服裝行業(yè)環(huán)保低碳生產(chǎn)方案
- 鄂教版四年級(jí)心理健康教育全冊(cè)教案
- 蘇教一年級(jí)《心理健康》教案(完整版)
評(píng)論
0/150
提交評(píng)論