版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
對(duì)象/關(guān)系映射—Hibernate
學(xué)員要求:熟悉Java、SQL、JDBC,掌握面向?qū)ο蟮拈_發(fā)方法,并有實(shí)際項(xiàng)目開發(fā)經(jīng)驗(yàn)課程目標(biāo):理解O/RMapping原理,掌握Hibernate開發(fā)的相關(guān)知識(shí),并能使用Hibernate進(jìn)行實(shí)際項(xiàng)目開發(fā)作者:趙青高級(jí)軟件工程目錄持久層的概念及必要性hibernate框架及核心類介紹hibernate進(jìn)行持久化的一個(gè)例子hibernate如何解決對(duì)象和模型的不匹配對(duì)象的持久性生命周期對(duì)目前項(xiàng)目的進(jìn)一步封裝和思考高級(jí)軟件工程數(shù)據(jù)的持久化持久化持久層持久化如何演變?yōu)槌志脤樱渴遣皇侵灰趹?yīng)用中用了數(shù)據(jù)庫(kù)就天然具備了“持久層”了呢?未必!高級(jí)軟件工程只有持久化而沒有持久層網(wǎng)上商城購(gòu)物結(jié)算的例子高級(jí)軟件工程沒有持久層的特征業(yè)務(wù)邏輯和數(shù)據(jù)庫(kù)訪問邏輯混雜在一起,沒有清晰的界限,干擾了我們的視線,難于理解。業(yè)務(wù)規(guī)則的變動(dòng)必然影響到數(shù)據(jù)庫(kù)的訪問邏輯,反之亦然,笨重,難于維護(hù)。好處是:簡(jiǎn)單方便、開發(fā)迅速,不需要復(fù)雜的設(shè)計(jì),比較適合于業(yè)務(wù)簡(jiǎn)單的應(yīng)用。引入持久層后的系統(tǒng)架構(gòu)高級(jí)軟件工程改良后的設(shè)計(jì)引入DAO模式DAO=DataAccessorObject數(shù)據(jù)訪問對(duì)象數(shù)據(jù)庫(kù)訪問的實(shí)現(xiàn)細(xì)節(jié)被隱藏到DAO里面。DomainObject則提供了面向領(lǐng)域的對(duì)象,封裝了具體的業(yè)務(wù)規(guī)則。高級(jí)軟件工程引入DAO模式的優(yōu)點(diǎn)業(yè)務(wù)層無需關(guān)心具體的select、insert等操作,使得業(yè)務(wù)業(yè)務(wù)邏輯實(shí)現(xiàn)更加清晰,也使得開發(fā)人員的專業(yè)劃分成為可能,業(yè)務(wù)人員專注于業(yè)務(wù)邏輯編碼。業(yè)務(wù)層和持久層可以彼此獨(dú)立的變化,比如:僅僅替換數(shù)據(jù)訪問層的實(shí)現(xiàn),可以將系統(tǒng)部署在不同的數(shù)據(jù)庫(kù)平臺(tái)上。改良后的代碼高級(jí)軟件工程觀察DAO的實(shí)現(xiàn)細(xì)節(jié)問題的癥狀-用JDBC實(shí)現(xiàn)持久層為域中的每個(gè)類手工編寫持續(xù)性代碼的工作量繁重。這些代碼基本上都是“支撐性”代碼,單調(diào)、機(jī)械、乏味、不優(yōu)雅。特別是需要支持多種SQL方言時(shí),對(duì)于持久層的開發(fā)者是個(gè)大難題。高級(jí)軟件工程新需求的產(chǎn)生-通用的持久層框架將編寫支撐性代碼的工作量降到最低。編碼是有趣的工作,但是敲鍵盤決不有趣。凡是無趣的工作都交給機(jī)器去完成。對(duì)象模型和關(guān)系模型的映射(ORM),編碼時(shí)只需要關(guān)心對(duì)象,而無需再糾纏于JDBCResultSet中的字段。更好的移植性,只需要簡(jiǎn)單的修改配置參數(shù),即可實(shí)現(xiàn)底層數(shù)據(jù)庫(kù)的切換。目錄持久層的概念及必要性hibernate框架及核心類介紹hibernate進(jìn)行持久化的一個(gè)例子hibernate如何解決對(duì)象和模型的不匹配對(duì)象的持久性生命周期對(duì)目前項(xiàng)目的進(jìn)一步封裝和思考高級(jí)軟件工程Hibernate在應(yīng)用中的位置基于B/S的典型三層架構(gòu)
開發(fā)如何分層?業(yè)務(wù)邏輯層和持久化層絕不要依賴于展現(xiàn)層。持久層對(duì)于業(yè)務(wù)層是透明的,持久層和業(yè)務(wù)層的變化是彼此獨(dú)立的。Hibernate核心架構(gòu)高級(jí)軟件工程ConfigurationConfiguration類負(fù)責(zé)管理Hibernate的配置信息。它包括如下內(nèi)容:Hibernate運(yùn)行的底層信息:數(shù)據(jù)庫(kù)的URL、用戶名、密碼、JDBC驅(qū)動(dòng)類,數(shù)據(jù)庫(kù)Dialect,數(shù)據(jù)庫(kù)連接池等。Hibernate映射文件(*.hbm.xml)。Configurationcfg=newConfiguration();SessionFactory會(huì)話工廠緩存了生成的SQL語(yǔ)句和Hibernate在運(yùn)行時(shí)使用的映射元數(shù)據(jù)。會(huì)話工廠在應(yīng)用初始化時(shí)被創(chuàng)建,是一個(gè)重量級(jí)的類,它在多個(gè)應(yīng)用線程間進(jìn)行被共享,通常情況下,整個(gè)應(yīng)用只有唯一的一個(gè)會(huì)話工廠,然而,如果你使用Hibernate訪問多個(gè)數(shù)據(jù)庫(kù),你需要對(duì)每一個(gè)數(shù)據(jù)庫(kù)使用一個(gè)會(huì)話工廠。應(yīng)用程序從會(huì)話工廠里獲得Session(會(huì)話)實(shí)例。SessionFactorysessionFactory=cfg.buildSessionFactory();高級(jí)軟件工程SessionSession也稱為持久化管理器,因?yàn)樗桥c持久化有關(guān)的操作接口。Session代表與數(shù)據(jù)庫(kù)之間的一次操作。Session通過SessionFactory打開,在所有的工作完成后,需要關(guān)閉。會(huì)話并不是線程安全的因此應(yīng)該被設(shè)計(jì)為每次只能在一個(gè)線程中使用。Sessionsession=sessionFactory.openSession();Transaction(事務(wù))Transaction將應(yīng)用代碼從底層的事務(wù)實(shí)現(xiàn)中抽象出來——可能是一個(gè)JDBC事務(wù)或一個(gè)JTA事務(wù),這有助于保持Hibernate應(yīng)用在不同類型的執(zhí)行環(huán)境或容器中的可移植性。使用Hibernate進(jìn)行操作時(shí)(增、刪、改)必須顯示的調(diào)用Transaction(默認(rèn):autoCommit=false)。Transactiontx=session.beginTransaction();高級(jí)軟件工程目錄持久層的概念及必要性hibernate框架及核心類介紹hibernate進(jìn)行持久化的一個(gè)例子hibernate如何解決對(duì)象和模型的不匹配對(duì)象的持久性生命周期對(duì)目前項(xiàng)目的進(jìn)一步封裝和思考對(duì)象-關(guān)系數(shù)據(jù)庫(kù)的基本映射publicclassUser{privateStringname;privateStringpassword;privateListaddress;………}createtabletbl_user(
namevarchar(255)notnull,
passwordvarchar(255),………. primarykey(name))對(duì)象關(guān)系數(shù)據(jù)庫(kù)類表對(duì)象記錄類的屬性(基本類型)表的列1:n/n:1外鍵高級(jí)軟件工程一個(gè)簡(jiǎn)單例子Department.hbm.xmlHibernate基本數(shù)據(jù)類型高級(jí)軟件工程實(shí)例前的準(zhǔn)備—項(xiàng)目目錄結(jié)構(gòu)高級(jí)軟件工程insertDepartmentdep=newDepartment();
dep.setName(“軟件開發(fā)部”);
Sessions=sessionFactory.openSession();
Transactiontx=s.beginTransaction();
s.save(dep);
mit();
s.close();LoadSessions=sessionFactory.openSession();
Departmentdep=(Department)s.get(Department.class,depID);
s.close();updateSessions=sessionFactory.openSession();
Transactiontx=s.beginTransaction();
Departmentdep=(Department)s.get(Department.class,depID);
dep.setName("ggggg");
s.update(dep);
mit();
s.close();deleteSessions=sessionFactory.openSession();
Transactiontx=s.beginTransaction();
Departmentdep=(Department)s.get(Department.class,depID);
s.delete(dep);
mit();
s.close();使用Ant構(gòu)建開發(fā)過程AnotherNeatTool另一個(gè)整潔的工具。ANT是一個(gè)基于Java的自動(dòng)化腳本引擎,腳本格式為XML。每個(gè)ant腳本(缺省叫build.xml)中設(shè)置了一系列任務(wù)(target),而多個(gè)任務(wù)之間往往又包含了一定的依賴關(guān)系。Ant可以簡(jiǎn)化項(xiàng)目的編譯、測(cè)試、文檔、部署等日常工作的手工工作量。進(jìn)一步減少編碼量-XDocletXDoclet的靈感來自JavaDoc,JavaDoc把文檔寫在代碼里,簡(jiǎn)化了文檔與程序同步問題。為web、ejb、struts、webwork、hibernate、jdo、jmx等等生成描述文件、源碼等?,F(xiàn)在的XDoclet已經(jīng)發(fā)展成了一個(gè)全功能的、面向?qū)傩缘拇a生成框架。(Attribute-OrientedProgramming)目錄持久層的概念及必要性hibernate框架及核心類介紹hibernate進(jìn)行持久化的一個(gè)例子hibernate如何解決對(duì)象和模型的不匹配對(duì)象的持久性生命周期對(duì)目前項(xiàng)目的進(jìn)一步封裝和思考Hibernate面臨的挑戰(zhàn):對(duì)象—關(guān)系模型的不匹配(ParadigmMismatch)粒度問題。(granularity)子類型問題。(subtypes)同一性問題。(identity)關(guān)聯(lián)問題。(associations)對(duì)象導(dǎo)航問題。(navigation)Identity——同一性問題對(duì)象的同一性(identity):==是jvm定義的概念。對(duì)象的相等性(equality):javaAPI定義的方法。實(shí)現(xiàn)equals()方法。數(shù)據(jù)庫(kù)對(duì)象的同一性(identity):指向同一個(gè)表的同一個(gè)記錄。DatabaseidentitywithHibernate
為持久化類增加一個(gè)identifierproperty。Identifier的值等于數(shù)據(jù)庫(kù)中該記錄的主鍵值,對(duì)于業(yè)務(wù)而言沒有實(shí)際意義,一般該屬性命名為id。通常設(shè)置getID()為public,因?yàn)橥ㄟ^id查找對(duì)象會(huì)很方便,而setID()設(shè)為private,其值由hibernate產(chǎn)生,id不可以改變。a==b;a.equals(b);a.getID().equals(b.getID())。主鍵的選擇naturalkeys:從業(yè)務(wù)意義上尋找一個(gè)或者多個(gè)屬性來區(qū)分唯一性,和是否是自動(dòng)產(chǎn)生的無關(guān)。業(yè)務(wù)邏輯和數(shù)據(jù)邏輯位于不同的層面,應(yīng)該有清晰的界定,不要把業(yè)務(wù)邏輯牽扯到數(shù)據(jù)邏輯中,否則業(yè)務(wù)邏輯的變化將對(duì)數(shù)據(jù)邏輯產(chǎn)生根本的影響。syntheticidentifiers(surrogatekeys):surrogatekeys沒有業(yè)務(wù)含義,它是由數(shù)據(jù)庫(kù)或者應(yīng)用產(chǎn)生的。compositekeys:多個(gè)naturalkeys聯(lián)合組成的primarykey。歷史的遺留系統(tǒng)無法避免。identifiergenerator——主鍵生成策略<idname="departmentID"column="department_id"type="long"><generatorclass=“native"></generator></id>native:hibernate將根據(jù)底層數(shù)據(jù)庫(kù)的方言(Dialect)來選擇,SQLServer用identity,Oracle用sequence等。increment:主鍵按數(shù)值順序遞增。此方式的實(shí)現(xiàn)機(jī)制為在當(dāng)前應(yīng)用實(shí)例中維持一個(gè)變量,以保存著當(dāng)前的最大值,之后每次需要生成主鍵的時(shí)候?qū)⒋酥导?作為主鍵。應(yīng)用于single-server的環(huán)境下特別高效,如果被部署成多個(gè)應(yīng)用的環(huán)境,會(huì)造成主鍵重復(fù)錯(cuò)誤。
uuid.hex:用一個(gè)128-bit的UUID算法生成字符串類型的標(biāo)識(shí)符。使用了IP地址,JVM的啟動(dòng)時(shí)間(精確到1/4秒),系統(tǒng)時(shí)間和一個(gè)計(jì)數(shù)器值(在JVM中唯一)。用該算法生成的id可以確保在一個(gè)網(wǎng)絡(luò)中唯一。適用于多應(yīng)用的環(huán)境,即使在多實(shí)例并發(fā)的環(huán)境中也可以確保唯一。并且解決了多個(gè)數(shù)據(jù)庫(kù)的部分?jǐn)?shù)據(jù)合并。granularity——粒度問題fine-grainedobjectmodel適當(dāng)?shù)募?xì)粒度對(duì)象模型:所謂細(xì)粒度模型,就是將原本業(yè)務(wù)模型中的對(duì)象加以細(xì)分,從而得到更加精細(xì)的對(duì)象模型。細(xì)粒度模型的設(shè)計(jì)該設(shè)計(jì)體現(xiàn)了一個(gè)“合成”的關(guān)系(composition):即整體和部分的關(guān)系。部分不可獨(dú)立存在而依賴于整體。sendMessage()這種細(xì)粒度的設(shè)計(jì)更好的體現(xiàn)了類的內(nèi)聚性,體現(xiàn)了對(duì)象設(shè)計(jì)的職責(zé)分配原則:將職責(zé)分配給擁有履行一個(gè)職責(zé)所必需信息的類。數(shù)據(jù)庫(kù)設(shè)計(jì)的思考這樣的設(shè)計(jì)是不必要的,并且存在性能問題。EntityandComponent在Java中不存在實(shí)體類和component類的區(qū)別,所有類的含義都是相同的。持久化的類需要對(duì)應(yīng)數(shù)據(jù)庫(kù)的表,而表中記錄的唯一性是通過主鍵實(shí)現(xiàn)的。故持久化的類需要區(qū)分實(shí)體類和component類。Entity類有數(shù)據(jù)庫(kù)的主鍵值,Entity類有自己的生命周期,它不依賴于其他的類而獨(dú)立存在。component類沒有相應(yīng)的主鍵值,它從屬于Entity,它的生命周期從屬于Entity,隨著Entity的消亡而消亡。component類也稱valuetype。映射文件的格式Subtypes——子類型問題對(duì)象模型存在“isa”和“hasa”的關(guān)系,而關(guān)系模型僅僅存在“hasa”的關(guān)系,這是對(duì)象模型和關(guān)系模型最明顯的mismatch,如何將“isa”轉(zhuǎn)化為數(shù)據(jù)庫(kù)中的“hasa”是hibernate需要解決的問題。Tableperconcreteclass這是最簡(jiǎn)單的一種方式:每一個(gè)子類對(duì)應(yīng)一張表,父類沒有表。這種方式會(huì)產(chǎn)生“Polymorphicqueries”的問題。Polymorphicqueries—多態(tài)查詢對(duì)于父類的查詢需要運(yùn)行多條select語(yǔ)句,每個(gè)子類一條。
selectCREDIT_CARD_ID,OWNER,NUMBER,CREATED,TYPE,...fromCREDIT_CARDwhereCREATED=?
selectBANK_ACCOUNT_ID,OWNER,NUMBER,CREATED,BANK_NAME,...fromBANK_ACCOUNTwhereCREATED=?父類的變動(dòng)困難:父類的變動(dòng)會(huì)影響所有的子類屬性,從而會(huì)影響多個(gè)表中的字段。僅僅用在不需要多態(tài)查詢的場(chǎng)合。Tableperclasshierarchy整個(gè)繼承樹對(duì)應(yīng)一張表,子類用typediscriminator字段來區(qū)分。這種方式在性能和簡(jiǎn)單性兩方面都做的很好。父類的變動(dòng)很方便。多態(tài)查詢查詢父類
selectBILLING_DETAILS_ID,BILLING_DETAILS_TYPE,OWNER,...,CREDIT_CARD_TYPE,fromBILLING_DETAILSwhereCREATED=?查詢子類
selectBILLING_DETAILS_ID,CREDIT_CARD_TYPE,CREDIT_CARD_EXP_MONTH,...fromBILLING_DETAILSwhereBILLING_DETAILS_TYPE='CC'andCREATED=?problem:子類屬性對(duì)應(yīng)的column不可以有notnull的約束。映射文件的格式Tablepersubclass這種設(shè)計(jì)符合數(shù)據(jù)庫(kù)的設(shè)計(jì)范式。但是可能會(huì)有嚴(yán)重的性能問題。多態(tài)查詢的解決——父類查詢父類:用outerjoin
多態(tài)查詢的解決——子類查詢子類:用innerjoin這種方式如果用手工寫代碼完成則很困難。查詢需要關(guān)聯(lián)多張表,對(duì)于復(fù)雜的繼承樹結(jié)構(gòu),性能是個(gè)大問題。映射文件格式繼承策略選擇一般原則:如果你不需要多態(tài)查詢,可以考慮用table-per-concrete-class,如果你需要多態(tài)查詢,并且子類的屬性差異不大,考慮用table-per-class-hierarchy,但是如果子類的屬性差異很大,考慮用table-per-subclass。經(jīng)驗(yàn):對(duì)于一般的解決,盡量用table-per-class-hierarchy,table-per-subclass請(qǐng)慎重使用。associations—關(guān)聯(lián)對(duì)象之間通過reference和reference集合來關(guān)聯(lián),而關(guān)系模型則通過外鍵進(jìn)行關(guān)聯(lián)。對(duì)象的reference是有方向性的,始終是單向的,如果需要雙向的,則需要定義兩次;外鍵則沒有方向性,或者說天然就是雙向的,因此導(dǎo)航對(duì)于關(guān)系模型沒有意義。對(duì)象模型存在多對(duì)多的關(guān)系,而關(guān)系模型只有one-to-many和one-to-one。如果關(guān)系模型要實(shí)現(xiàn)多對(duì)對(duì),需要一個(gè)linktable,而這個(gè)linktable不存在于對(duì)象模型中。manytooneonetomany雙向關(guān)聯(lián)產(chǎn)生的問題在內(nèi)存中有兩個(gè)不同的地方代表同一個(gè)值:即外鍵item_id如果我們調(diào)用了bid.setItem(item);bids.add(bid);hibernate會(huì)認(rèn)為是兩個(gè)不同的持久類發(fā)生了變動(dòng),它并不知道這兩個(gè)變動(dòng)實(shí)際上是指向同一個(gè)數(shù)據(jù)庫(kù)的字段,hibernate會(huì)更新兩次。我們需要告訴hibernate這是一個(gè)雙向的關(guān)聯(lián)。主控方和被控方inverse=“true”即告訴
hibernate對(duì)方是主控方。
由bid端負(fù)責(zé)保持和
數(shù)據(jù)庫(kù)的同步。如果調(diào)用bids.add(bid);則不發(fā)生任何持久化動(dòng)作,只有調(diào)用了bid.setItem(item);才持久化。原則:應(yīng)該將many端設(shè)為主控方,這樣有助于改善性能。cascadingsave當(dāng)我們把bid加入到item,
并且把item持久化的時(shí)候,
我們希望bid能夠自動(dòng)的
持久化,而不用顯示的去調(diào)用。cascade屬性告訴hibernatebid可以被級(jí)聯(lián)持久化。cascade是有方向性的,也可以在bid端設(shè)置級(jí)聯(lián)持久化item,但是因?yàn)閎id是在item后創(chuàng)建的,這樣做沒有意義。cascadingdeleteItem和bid應(yīng)該是父子關(guān)系,item如果被刪除,bid也應(yīng)被刪除。子對(duì)象的生命周期依賴于父對(duì)象。這類似于Entity/Component的關(guān)系,但是有本質(zhì)的區(qū)別。Bid可以單獨(dú)的被加載,而component不能;bid可被共享而component不能。bid如果被item內(nèi)的集合刪除,則應(yīng)該在持久化層被刪除。目錄持久層的概念及必要性hibernate框架及核心類介紹hibernate進(jìn)行持久化的一個(gè)例子hibernate如何解決對(duì)象和模型的不匹配對(duì)象的持久性生命周期對(duì)目前項(xiàng)目的進(jìn)一步封裝和思考對(duì)象的持久生命周期持久類和一般類只有概念上的區(qū)別,從代碼上看沒有區(qū)別,持久類不知道自己的持久狀態(tài),所有的業(yè)務(wù)邏輯也與對(duì)象是在內(nèi)存中還是在數(shù)據(jù)庫(kù)中無關(guān)。內(nèi)存中的對(duì)象只有兩種狀態(tài):有用和無用。Hibernate通過session來控制對(duì)象的持久生命周期:transient,persistent,detached.Transientobjectsnew生成的對(duì)象稱為Transient,它沒有與數(shù)據(jù)庫(kù)中的某一行記錄關(guān)聯(lián),一旦它被dereferenced就會(huì)被JVM回收。hibernate認(rèn)為所有的transient對(duì)象都是非事務(wù)的,hibernate不提供對(duì)這些對(duì)象的回滾支持。僅僅被transient對(duì)象reference的對(duì)象也是transient對(duì)象。Persistentobjectspersistent對(duì)象對(duì)應(yīng)數(shù)據(jù)庫(kù)的一條記錄,并且具有databaseidentity。對(duì)于transient對(duì)象,調(diào)用session.save()可以將其轉(zhuǎn)變?yōu)閜ersistentobject。如果通過session.load()加載一個(gè)對(duì)象,該對(duì)象也是persistent狀態(tài)。hibernate對(duì)persistent對(duì)象提供與數(shù)據(jù)庫(kù)的同步支持和事務(wù)支持。與數(shù)據(jù)庫(kù)的同步臟數(shù)據(jù):數(shù)據(jù)僅僅在內(nèi)存中更新而沒有同步到數(shù)據(jù)庫(kù)中稱為臟數(shù)據(jù)。hibernate會(huì)監(jiān)測(cè)臟數(shù)據(jù),在盡可能遲的時(shí)候做同步的動(dòng)作。(transparenttransaction-levelwrite-behind)hibernate可以做到僅僅更新有變動(dòng)的屬性,但是需要在映射文件中設(shè)置dynamic-update=“true”,默認(rèn)是false。這個(gè)功能用手工很難完成。Detachedobjects當(dāng)調(diào)用session.close(),原先的persistentobject就轉(zhuǎn)化為detachedobject。detachedobject和數(shù)據(jù)庫(kù)失去了聯(lián)系,但是它們不是transientobject,它們具有datebaseidentity。hibernate可以在新的事務(wù)中重新聯(lián)系detachedobject。這樣可以在多個(gè)層面中傳遞這些持久對(duì)象。對(duì)于多層架構(gòu)的設(shè)計(jì)產(chǎn)生重大影響。例子——1例子——2例子——3對(duì)象的狀態(tài)圖區(qū)分transientanddetached對(duì)象Identifier屬性是否為null對(duì)于非對(duì)象類型的Identifier,判斷unsaved-value的值優(yōu)先考慮使用對(duì)象類型的Identifier,因?yàn)閷?duì)象可以為null。該方法只對(duì)synthetickeys有效,對(duì)于assignedkeys和compositekeys無效。Thescopeofobjectidentitynoidentityscope:數(shù)據(jù)的同一性沒有范圍,同一條記錄分別取兩次,返回的對(duì)象不滿足a==b;transaction-scopedidentity:在同一個(gè)事務(wù)中,同一條記錄取兩次,滿足a==b,在事務(wù)級(jí)別需要緩存;Process-scopedidentity:在同一個(gè)進(jìn)程中只有一個(gè)對(duì)象被返回,范圍達(dá)到整個(gè)JVM。對(duì)象樹通常大型應(yīng)用中操作的不可能只有一個(gè)對(duì)象,而是一個(gè)對(duì)象圖。Persistencebyreachabilitycompute被持久化時(shí),它所reference的任何對(duì)象都被持久化,但是不包括“Electronics”和“CellPhones”。這是一個(gè)遞歸的過程。在理想的環(huán)境中:root對(duì)象被加載,那么整個(gè)對(duì)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海勞動(dòng)合同范本
- 互聯(lián)網(wǎng)醫(yī)療項(xiàng)目合作合同
- 市場(chǎng)攤位租賃合同租賃合同
- 網(wǎng)絡(luò)安全技術(shù)保障與免責(zé)合同
- 智能交通系統(tǒng)開發(fā)合同
- 2025年單面凈化工作臺(tái)項(xiàng)目投資可行性研究分析報(bào)告
- 二零二四年度體育場(chǎng)館建設(shè)與運(yùn)營(yíng)管理合同3篇帶眉腳
- 二零二四年古裝劇美術(shù)風(fēng)格指導(dǎo)與聘用合同3篇
- 二手房買賣定金合同范本共(2024版)
- 二零二四年度企業(yè)員工晉升與職業(yè)生涯規(guī)劃服務(wù)合同3篇
- 人教版《道德與法治》四年級(jí)下冊(cè)教材簡(jiǎn)要分析課件
- 2023年MRI技術(shù)操作規(guī)范
- 辦公用品、易耗品供貨服務(wù)方案
- 自行聯(lián)系單位實(shí)習(xí)申請(qǐng)表
- 醫(yī)療廢物集中處置技術(shù)規(guī)范
- 媒介社會(huì)學(xué)備課
- 2023年檢驗(yàn)檢測(cè)機(jī)構(gòu)質(zhì)量手冊(cè)(依據(jù)2023年版評(píng)審準(zhǔn)則編制)
- 三相分離器原理及操作
- 新教科版五年級(jí)下冊(cè)科學(xué)全冊(cè)每節(jié)課后練習(xí)+答案(共28份)
- 葫蘆島尚楚環(huán)??萍加邢薰踞t(yī)療廢物集中處置項(xiàng)目環(huán)評(píng)報(bào)告
- 全國(guó)物業(yè)管理項(xiàng)目經(jīng)理考試試題
評(píng)論
0/150
提交評(píng)論