ORMObjectRelationalMapper---Hibernate對(duì)象映射復(fù)習(xí)進(jìn)程_第1頁(yè)
ORMObjectRelationalMapper---Hibernate對(duì)象映射復(fù)習(xí)進(jìn)程_第2頁(yè)
ORMObjectRelationalMapper---Hibernate對(duì)象映射復(fù)習(xí)進(jìn)程_第3頁(yè)
ORMObjectRelationalMapper---Hibernate對(duì)象映射復(fù)習(xí)進(jìn)程_第4頁(yè)
ORMObjectRelationalMapper---Hibernate對(duì)象映射復(fù)習(xí)進(jìn)程_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Good is good, but better carries it.精益求精,善益求善。ORMObjectRelationalMapper-Hibernate對(duì)象映射-HYPERLINK/linzheng/archive/2011/01/03/1924852.html三、ORM(Object/RelationalMapper)-Hibernate對(duì)象映射一.ORM(Object/RelationalMapper)1.OR映射-Hibernate基本數(shù)據(jù)類(lèi)型Hibernate基本類(lèi)型Java類(lèi)型標(biāo)準(zhǔn)SQL字段類(lèi)型booleanboolean,java.lang.BooleanBITyes_n

2、oboolean,java.lang.BooleanCHAR(1)(Y/N)true_falseboolean,java.lang.BooleanCHAR(1)(Y/N)bytebyte,java.lang.ByteTINYINTshortshort,java.lang.ShortSMALLINTintegerint,java.lang.IntegerINTEGERlonglong,java.lang.LongBIGINTfloatfloat,java.lang.FloatFLOATdoubledouble,java.lang.DoubleDOUBLEbig_decimaljava.math.

3、BigDecimalNUMBERICcharacterjava.lang.StringCHAR(1)stringjava.lang.StringVARCHARdatejava.util.Date,java.sql.DateDATEtimejava.util.Date,java.sql.TimeTIMEtimestampjava.util.Date,java.sql.TimeStampTIMESTAMPcalendarjava.util.CalendarTIMESTAMPcalendar_datejava.util.CalendarDateclobjava.sql.ClobCLOBblobjav

4、a.sql.BlobBLOBbinarybyteVARBINARY,BLOBtextjava.lang.StringCLOBseralizablejava.io.SerializableVARBINARY,BLOBclassjava.lang.ClassVARCHARlocaljava.util.LocaleVARCHARtimezonejava.util.TimeZoneVARCHARcurrencyjava.util.CurrencyVARCHAR2.OR映射-實(shí)體映射示例*.hbm.xml,主體內(nèi)容包含表/類(lèi)映射,id映射,屬性字段映射三個(gè)部分.示例文件:XML文件頭定義了文件的編碼方式

5、,DTD與Hibernate的版本有關(guān),上面是使用hibernate3.x使用的DTD.3.OR映射-表/類(lèi)映射name:指定了Java數(shù)據(jù)封裝的POJO類(lèi)類(lèi)型.table:指定了數(shù)據(jù)庫(kù)的表名4.OR映射-id映射name:指定了映射POJO類(lèi)的屬性名,type:POJO類(lèi)中屬性的數(shù)據(jù)類(lèi)型;column:數(shù)據(jù)庫(kù)表的主鍵字段;generator子元素:由其class屬性指定主鍵生成方式:assigned:主鍵由應(yīng)用程序產(chǎn)生,不需要hibernate干預(yù)identity:使用數(shù)據(jù)庫(kù)的主鍵生成機(jī)制,如MySQL,DB2、SQLServer的自增主鍵.sequence:使用數(shù)據(jù)庫(kù)的sequence機(jī)制

6、,如Oracle的sequenceuuid.hex:由Hibernate基于128位唯一值產(chǎn)生算法,根據(jù)ip,時(shí)間,jvm啟動(dòng)時(shí)間,內(nèi)部自增量生成十六進(jìn)制的數(shù)值,編碼后成為一個(gè)32位長(zhǎng)的字符串.該方法提供了最好的數(shù)據(jù)庫(kù)插入性能和數(shù)據(jù)庫(kù)平臺(tái)適應(yīng)性.uuid.string:與uuid.hex類(lèi)似,只是生成的主鍵沒(méi)有進(jìn)行編碼,只有16位長(zhǎng)度.在某些數(shù)據(jù)庫(kù)可能出錯(cuò).hilo:通過(guò)hilo算法實(shí)現(xiàn)主鍵生成,需要額外的數(shù)據(jù)庫(kù)表保存主鍵生成歷史狀態(tài).seqhilo:與hilo類(lèi)似,只是主鍵歷史狀態(tài)保存在sequence中,適用于支持sequence的數(shù)據(jù)庫(kù).increment:主鍵按數(shù)值遞增,但如果多個(gè)實(shí)例

7、同時(shí)訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù),各自生成主鍵,則容易造成主鍵重復(fù).native:由hibernate根據(jù)數(shù)據(jù)庫(kù)適配器中的定義,自動(dòng)采用identity,hilo,sequence中的一種方式.foreign:外部表的字段作主鍵.select:hibernate3中新增的.需要提供一個(gè)唯一的標(biāo)識(shí)字段進(jìn)行二次讀取,以獲取觸發(fā)器生成的主鍵值,通過(guò)param子元素進(jìn)行定義,比如:key_field該方法主要針對(duì)遺留系統(tǒng)的改造工程,一些早期的系統(tǒng)主鍵依賴于觸發(fā)器生成.當(dāng)數(shù)據(jù)庫(kù)insert時(shí),觸發(fā)器捕獲這一操作,并為主鍵賦值,在插入數(shù)據(jù)庫(kù)后,再次讀取某一識(shí)別字段讀取已經(jīng)插入的數(shù)據(jù),獲取其主鍵值.5.OR映射-復(fù)合主

8、鍵映射(composite-id)-實(shí)體屬性組成主鍵復(fù)合主鍵使用將取代id元素,并具有property屬性列表.復(fù)合主鍵的POJO類(lèi)需要實(shí)現(xiàn)equals和hashcode方法,可以使用apachecommonslang包中的工具類(lèi)實(shí)現(xiàn)(commons-lang.jar),比如:mons.lang.builder.EqualsBuilder;mons.lang.builder.HashCodeBuilder;mons.lang.builder.ToStringBuilder;.publicStringtoString()returnnewToStringBuilder(this).append(

9、userid,getUserid().append(when,getWhen().toString();publicbooleanequals(Objectother)if(!(otherinstanceofMyPoJoClass)returnfalse;MyPoJoClasscastOther=(MyPoJoClass)other;returnnewEqualsBuilder().appendSuper(super.equals(other).append(this.getUserid(),castOther.getUserid().append(this.getWhen(),castOth

10、er.getWhen().isEquals();publicinthashCode()returnnewHashCodeBuilder().appendSuper(super.hashCode().append(getUserid().append(getWhen().toHashCode();裝載復(fù)合主鍵的記錄時(shí),考慮把類(lèi)對(duì)應(yīng)的對(duì)象的主鍵值填充好后作為load的第二個(gè)參數(shù).MyPoJoClassobj=newMyPoJoClass();obj.setUserid(.);obj.setWhen(.);obj=(MyPoJoClass)session.load(MyPoJoClass.class

11、,obj);6.OR映射-復(fù)合主鍵映射(composite-id)-基于主鍵類(lèi)可以用一個(gè)獨(dú)立的類(lèi)來(lái)描述主鍵,示例:此時(shí),需要定義一個(gè)新的類(lèi)KeyClass來(lái)作為主鍵類(lèi),KeyClass實(shí)現(xiàn)equals和hashcode方法,而在POJO中,使用屬性名keyClassProperty來(lái)表示主鍵,其類(lèi)類(lèi)型為KeyClass.7.OR映射-composite-id其他子節(jié)點(diǎn)composite-id除了key-property子節(jié)點(diǎn)外,還具有可選子節(jié)點(diǎn).完整的節(jié)點(diǎn)內(nèi)容:.8.OR映射-屬性/字段映射name:POJO類(lèi)的屬性名,type:POJO類(lèi)中屬性的數(shù)據(jù)類(lèi)型;如果是字符串,可以省略column:

12、數(shù)據(jù)庫(kù)中的字段名.如果和屬性同名,可以省略.9.OR映射-自定義數(shù)據(jù)類(lèi)型UserType,CompositeUserType接口hibernate3中的為:org.hibernate.usertype(hibernate2中為net.sf包)下面的兩個(gè)接口:UserType和CompositeUserType.它們提供自定義類(lèi)型的規(guī)范,這里以UserType為例.packageorg.hibernate.usertype;importjava.io.Serializable;importjava.sql.PreparedStatement;importjava.sql.ResultSet;im

13、portjava.sql.SQLException;importorg.hibernate.HibernateException;publicinterfaceUserType/*返回本類(lèi)型所映射的SQL類(lèi)型,返回的是int數(shù)組.可以取java.sql.Types中的int靜態(tài)常量.*比如有:publicfinalstaticintDOUBLE=8;*/publicintsqlTypes();/*定義本類(lèi)型的nullSafeGet()方法返回的數(shù)據(jù)的類(lèi)型*/publicClassreturnedClass();/*定義兩個(gè)數(shù)據(jù)的比較方法,返回true表示相等,false表示不等.*/publi

14、cbooleanequals(Objectx,Objecty)throwsHibernateException;/*Getahashcodefortheinstance,consistentwithpersistenceequality*/publicinthashCode(Objectx)throwsHibernateException;/*定義從ResultSet中讀取數(shù)據(jù)并轉(zhuǎn)換成自定義類(lèi)型的方法,對(duì)數(shù)據(jù)庫(kù)null應(yīng)該考慮*參數(shù)names包含了當(dāng)前自定義類(lèi)型的映射字段名稱*/publicObjectnullSafeGet(ResultSetrs,Stringnames,Objectowne

15、r)throwsHibernateException,SQLException;/*Hibernate進(jìn)行數(shù)據(jù)保存時(shí)被調(diào)用的方法*paramstaJDBCpreparedstatement*paramvaluetheobjecttowrite,類(lèi)型應(yīng)該是returnedClass()方法返回的Class指定的類(lèi)型*paramindexstatementparameterindex*throwsHibernateException*throwsSQLException*/publicvoidnullSafeSet(PreparedStatementst,Objectvalue,intindex)

16、throwsHibernateException,SQLException;/*自定義的對(duì)象復(fù)制方法,用作構(gòu)造返回對(duì)象.*nullSafeGet方法被調(diào)用后,Hibernate獲得了自定義數(shù)據(jù)對(duì)象,*這個(gè)對(duì)象成為數(shù)據(jù)庫(kù)讀出的原始對(duì)象,通過(guò)deepCopy方法,Hibernate*返回一個(gè)復(fù)本給用戶.臟數(shù)據(jù)檢查時(shí),如果兩個(gè)對(duì)象不等(equals方法返回false),*就會(huì)執(zhí)行數(shù)據(jù)庫(kù)持久化操作.*paramvaluetheobjecttobecloned,whichmaybenull*returnObjectacopy*/publicObjectdeepCopy(Objectvalue)throw

17、sHibernateException;/*Areobjectsofthistypemutable?*本類(lèi)型實(shí)例是否可變*returnboolean*/publicbooleanisMutable();/*把對(duì)象轉(zhuǎn)化為二級(jí)緩存中保存.經(jīng)常把當(dāng)前對(duì)象對(duì)其他對(duì)象的引用,保存為其id值.*Transformtheobjectintoitscacheablerepresentation.Attheveryleastthis*methodshouldperformadeepcopyifthetypeismutable.Thatmaynotbeenough*forsomeimplementations,h

18、owever;forexample,associationsmustbecachedas*identifiervalues.(optionaloperation)*paramvaluetheobjecttobecached*returnacachablerepresentationoftheobject*throwsHibernateException*/publicSerializabledisassemble(Objectvalue)throwsHibernateException;/*把二級(jí)緩存中獲取的數(shù)據(jù)轉(zhuǎn)換為自定義的對(duì)象數(shù)據(jù)*Reconstructanobjectfromthecac

19、heablerepresentation.Attheveryleastthis*methodshouldperformadeepcopyifthetypeismutable.(optionaloperation)*paramcachedtheobjecttobecached*paramownertheownerofthecachedobject*returnareconstructedobjectfromthecachablerepresentation*throwsHibernateException*/publicObjectassemble(Serializablecached,Obje

20、ctowner)throwsHibernateException;/*Duringmerge,replacetheexisting(target)valueintheentitywearemergingto*withanew(original)valuefromthedetachedentitywearemerging.Forimmutable*objects,ornullvalues,itissafetosimplyreturnthefirstparameter.For*mutableobjects,itissafetoreturnacopyofthefirstparameter.Forob

21、jects*withcomponentvalues,itmightmakesensetorecursivelyreplacecomponentvalues.*paramoriginalthevaluefromthedetachedentitybeingmerged*paramtargetthevalueinthemanagedentity*returnthevaluetobemerged*/publicObjectreplace(Objectoriginal,Objecttarget,Objectowner)throwsHibernateException;如果一個(gè)用戶具有多個(gè)email,可以

22、分別定義多個(gè)字段保存,也可以定義一個(gè)子表專門(mén)保存,但都有點(diǎn)大動(dòng)干戈.可以考慮用一個(gè)字符串字段保存,相鄰的email用一個(gè);隔開(kāi).比如:packagecn.thinkmore.hibernate.pojo;importjava.io.Serializable;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Types;importjava.util.*;importorg.hibernate.Hibernate;importorg.hibern

23、ate.HibernateException;importorg.hibernate.usertype.UserType;publicclassEmailListimplementsUserTypeprivatestaticfinalStringSPLITTER=;privatestaticfinalintTYPES=newintTypes.VARCHAR;publicObjectassemble(Serializablecached,Objectowner)throwsHibernateExceptionreturnnull;publicObjectdeepCopy(Objectvalue)

24、throwsHibernateExceptionif(!(valueinstanceofList)returnnull;Listsrc=(List)value;Listtar=newArrayList();tar.addAll(src);returntar;publicSerializabledisassemble(Objectvalue)throwsHibernateExceptionreturnnull;publicbooleanequals(Objectx,Objecty)throwsHibernateExceptionif(x=y)returntrue;if(x!=null&y!=nu

25、ll)ListxList=(List)x;ListyList=(List)y;if(xList.size()!=yList.size()returnfalse;for(inti=0;ixList.size();i+)StringstrX=xList.get(i).toString();StringstrY=yList.get(i).toString();if(!strX.equals(strY)returnfalse;returnfalse;publicbooleanisMutable()returnfalse;publicObjectnullSafeGet(ResultSetrs,Strin

26、gnames,Objectowner)throwsHibernateException,SQLExceptionStringvalue=Hibernate.STRING.nullSafeGet(rs,names0).toString();if(null!=value)returnparse(value);returnnull;privateListparse(Stringvalue)Stringstrs=mons.lang.StringUtils.split(value,SPLITTER);Listemails=newArrayList();for(inti=0;istrs.length;i+

27、)emails.add(strsi);returnemails;privateStringassemble(Listlist)StringBuildersb=newStringBuilder();intmaxIndex=list.size()-1;for(inti=0;imaxIndex;i+)sb.append(list.get(i).append(SPLITTER);if(0=maxIndex)sb.append(list.get(maxIndex);returnsb.toString();publicvoidnullSafeSet(PreparedStatementst,Objectva

28、lue,intindex)throwsHibernateException,SQLExceptionif(null!=value&(valueinstanceofList)Stringstr=assemble(List)value);Hibernate.STRING.nullSafeSet(st,str,index);elseif(null!=value)Hibernate.STRING.nullSafeSet(st,value.toString(),index);elseHibernate.STRING.nullSafeSet(st,null,index);publicObjectrepla

29、ce(Objectoriginal,Objecttarget,Objectowner)throwsHibernateExceptionreturnnull;publicClassreturnedClass()returnList.class;publicintsqlTypes()returnTYPES;publicinthashCode(Objectx)throwsHibernateExceptionreturn0;數(shù)據(jù)關(guān)聯(lián)關(guān)系數(shù)據(jù)關(guān)聯(lián)關(guān)系在實(shí)體的子類(lèi)里面不會(huì)被自動(dòng)繼承.10.一對(duì)一關(guān)聯(lián)-主鍵關(guān)聯(lián)one-to-one一對(duì)一的主鍵關(guān)聯(lián),指兩個(gè)表的記錄是一對(duì)一的關(guān)系,且一個(gè)表的主鍵取為另一個(gè)表對(duì)應(yīng)

30、的記錄的主鍵.name:屬性名class:java全路徑類(lèi)名cascade:是否級(jí)連操作,all,noneouter-join:是否外鏈接,true/falsecitizenConstrained:次關(guān)聯(lián)中的約束方.Sessions=HibernateSession3.getSession();Citizenone=newCitizen();one.setIdcard(123456789012345678);one.setName(Mike);one.setSex(M);Genegene=newGene();gene.setBloodType(AB);gene.setDna(Ajodjjdjo

31、a);gene.setSpecial(White);one.setGene(gene);gene.setCitizen(one);Transactiontrans=s.beginTransaction();s.saveOrUpdate(one);mit();/兩條數(shù)據(jù)一起被保存,查詢時(shí)也會(huì)關(guān)聯(lián)查出來(lái).Queryquery=s.createQuery(FromCitizen);Listlist=query.list();for(inti=0;ilist.size();i+)one=(Citizen)list.get(i);if(null=one)continue;gene=(Gene)one.g

32、etGene();if(null!=gene)System.out.println(gene.getId()+:+gene.getSpecial()+:+gene.getDna();11.單向一對(duì)多關(guān)聯(lián)-唯一外鍵關(guān)聯(lián)one-to-many一個(gè)用戶可以多個(gè)email:12.雙向一對(duì)多關(guān)聯(lián)除了在主控方配置一對(duì)多,還要在被控方配置對(duì)應(yīng)的多對(duì)一關(guān)系:User:Email:再有例子:一個(gè)職員(是人的子類(lèi))前后可能有多條工作(每次工作是一條記錄):Usersmaybidfororsellauctionitems.!-publicstaticvoidtestOne2Many()Sessions=Hibern

33、ateSession3.getSession();Employeee=newEmployee();e.setName(一對(duì)多);e.setIdcard(123456789012345678);e.setBirth(newjava.sql.Date(System.currentTimeMillis()-24L*3600*1000*365*25);JobListjob1=newJobList();job1.setEmployee(e);job1.setCompany(Agongsi);job1.setBegin(newjava.sql.Date(System.currentTimeMillis()

34、-24L*3600*1000*365*5);job1.setEnd(newjava.sql.Date(System.currentTimeMillis()-24L*3600*1000*365*4);JobListjob2=newJobList();job2.setEmployee(e);job2.setCompany(Bgongsi);job2.setBegin(newjava.sql.Date(System.currentTimeMillis()-24L*3600*1000*365*4);job2.setEnd(newjava.sql.Date(System.currentTimeMillis()-24L*3600*1000*365*2);Setjobs=newHashSet();jobs.add(job1);jobs.add(job2);e.setJobs(jobs);Transactiontrans=s.beginTransaction();/兩個(gè)表的數(shù)據(jù)一起被保存,查詢時(shí)也會(huì)關(guān)聯(lián)查出來(lái).s.sav

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論