版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教部編版歷史九年級(jí)下冊(cè):第11課 《蘇聯(lián)的社會(huì)主義建設(shè)》 聽(tīng)課評(píng)課記錄
- 《溝通中外文明的“絲綢之路”》名師聽(tīng)課評(píng)課記錄(新部編人教版七年級(jí)上冊(cè)歷史)
- 生物醫(yī)藥產(chǎn)業(yè)園監(jiān)理合同(2篇)
- 電力價(jià)格調(diào)整合同(2篇)
- 五年級(jí)上冊(cè)數(shù)學(xué)聽(tīng)評(píng)課記錄《7.1 誰(shuí)先走》(3)-北師大版
- 部編人教版歷史九年級(jí)上冊(cè)第15課《探尋新航路》聽(tīng)課評(píng)課記錄
- 湘教版數(shù)學(xué)八年級(jí)上冊(cè)《小結(jié)練習(xí)》聽(tīng)評(píng)課記錄5
- 人教版數(shù)學(xué)七年級(jí)上冊(cè)3.2《解一元一次方程(一)-合并同類(lèi)項(xiàng)與移項(xiàng)》聽(tīng)評(píng)課記錄1
- 五年級(jí)上冊(cè)數(shù)學(xué)聽(tīng)評(píng)課記錄-總復(fù)習(xí)2-北師大版
- 新版湘教版秋八年級(jí)數(shù)學(xué)上冊(cè)第二章三角形課題三角形的內(nèi)角和定理聽(tīng)評(píng)課記錄
- 必修3《政治與法治》 選擇題專練50題 含解析-備戰(zhàn)2025年高考政治考試易錯(cuò)題(新高考專用)
- 二零二五版電商企業(yè)兼職財(cái)務(wù)顧問(wèn)雇用協(xié)議3篇
- 課題申報(bào)參考:流視角下社區(qū)生活圈的適老化評(píng)價(jià)與空間優(yōu)化研究-以沈陽(yáng)市為例
- 《openEuler操作系統(tǒng)》考試復(fù)習(xí)題庫(kù)(含答案)
- 17J008擋土墻(重力式、衡重式、懸臂式)圖示圖集
- 2024-2025學(xué)年人教版生物八年級(jí)上冊(cè)期末綜合測(cè)試卷
- 大數(shù)據(jù)背景下網(wǎng)絡(luò)輿情成因及治理
- 道教系統(tǒng)諸神仙位寶誥全譜
- 中國(guó)經(jīng)濟(jì)轉(zhuǎn)型導(dǎo)論-政府與市場(chǎng)的關(guān)系課件
- 新視野大學(xué)英語(yǔ)讀寫(xiě)教程 第三版 Book 2 unit 8 教案 講稿
- 村務(wù)公開(kāi)表格
評(píng)論
0/150
提交評(píng)論