ORM问题
但是,充分證明的對(duì)象關(guān)系阻抗不匹配問(wèn)題不可避免地引起開(kāi)發(fā)人員的頭痛。 關(guān)系數(shù)據(jù)庫(kù)是建立在合理概念基礎(chǔ)上的一種專(zhuān)門(mén)技術(shù),但是它們不一定符合面向?qū)ο蟮氖澜纭?有幾種使用ORM的方法和樣式,各有優(yōu)缺點(diǎn)。
使用ORM的基本選擇之一是確定是從數(shù)據(jù)庫(kù)架構(gòu)生成ORM映射,還是從數(shù)據(jù)庫(kù)架構(gòu)生成ORM定義(可能是XML配置文件,注釋或類(lèi)似XDoclet之類(lèi)的數(shù)據(jù)庫(kù)架構(gòu)) )。
從數(shù)據(jù)庫(kù)架構(gòu)生成ORM層的前一種方法意味著,無(wú)論您要處理特定于數(shù)據(jù)庫(kù)的DDL還是具有某些抽象層,都必須以其自己的語(yǔ)言和術(shù)語(yǔ)來(lái)處理數(shù)據(jù)庫(kù),但是仍然被迫對(duì)待數(shù)據(jù)庫(kù)是什么。 不幸的是,這意味著您需要技術(shù)方面的專(zhuān)業(yè)知識(shí),并且可能比允許您生成架構(gòu)要花費(fèi)更多的工作。 但是,這迫使開(kāi)發(fā)人員正確理解和處理RDBMS –將DBMS視為簡(jiǎn)單數(shù)據(jù)存儲(chǔ)區(qū)既危險(xiǎn)又有害。 開(kāi)發(fā)人員在設(shè)計(jì)應(yīng)用程序時(shí)需要考慮鍵,索引等的影響,并將它們與關(guān)系數(shù)據(jù)庫(kù)的現(xiàn)實(shí)隔離開(kāi)可能很危險(xiǎn),而以我的經(jīng)驗(yàn)來(lái)看,這總是很糟糕的。 一個(gè)相關(guān)的問(wèn)題是POJO的使用,最終由ORM框架操縱。 從理論上講,這聽(tīng)起來(lái)不錯(cuò),但實(shí)際上您會(huì)遇到各種問(wèn)題,并且很可能將應(yīng)用程序邏輯與真正應(yīng)該構(gòu)成數(shù)據(jù)訪問(wèn)對(duì)象的邏輯相混合。 開(kāi)發(fā)人員和架構(gòu)師喜歡通過(guò)使用Spring和其他框架來(lái)贊揚(yáng)關(guān)注點(diǎn)的分離,沒(méi)有真正的理由為什么不應(yīng)在此處應(yīng)用相同的概念。 另一個(gè)小問(wèn)題是需要維護(hù)POJO和映射定義,但這通常不是太多的工作。
從模式生成ORM映射和代碼的第二種方法是我的首選方法。 根據(jù)我使用這兩種方法的經(jīng)驗(yàn),可以從模式中生成bean,從而可以智能地設(shè)計(jì)bean,并且僅根據(jù)需要使其變得復(fù)雜,同時(shí)可以免費(fèi)通過(guò)PK,按索引等進(jìn)行獲取。 由于它們都在持久性類(lèi)本身中進(jìn)行管理,因此管理惰性集合和引用對(duì)象之類(lèi)的事情也變得更加容易。 這種方法還避免了編寫(xiě)樣板POJO的需要,并迫使您將數(shù)據(jù)訪問(wèn)對(duì)象與域?qū)ο蠛蜆I(yè)務(wù)邏輯分開(kāi)對(duì)待。 以我從架構(gòu)生成數(shù)據(jù)訪問(wèn)bean的經(jīng)驗(yàn)來(lái)看,bean最終變得更豐富,更可用,性能更好,并且一旦建立了基礎(chǔ)架構(gòu),維護(hù)成本就會(huì)降低。 可能有人認(rèn)為您最終需要額外的數(shù)據(jù)包裝器類(lèi),但實(shí)際上,對(duì)單獨(dú)的Bean類(lèi)的需求與數(shù)據(jù)訪問(wèn)層中發(fā)生的情況無(wú)關(guān)。 這里的一個(gè)問(wèn)題是可以為您完成這一代工作的框架的可用性–過(guò)去,我曾使用過(guò)定制的解決方案,這些解決方案雖然效果很好并取得了回報(bào),但需要進(jìn)行初步的前期工作。 在較小的項(xiàng)目上,可能沒(méi)有足夠的回報(bào)值得在這種工作上進(jìn)行投資。 同時(shí),有一些ORM采用這種方法并生成持久實(shí)體類(lèi),例如jooq ,但是我必須嘗試一下。
Hibernate是Java領(lǐng)域中最流行的ORM,盡管它與處理大量SQL無(wú)關(guān),但是它存在一些問(wèn)題。 通常,該方法是定義映射和POJO,然后讓Hibernate管理SQL生成。 這樣做的問(wèn)題是,您定義的架構(gòu)通常不理想,并且最終忽略了諸如正確索引之類(lèi)的事情。 盡管您選擇使用其專(zhuān)有內(nèi)容的程度取決于您,但Hibernate也會(huì)迫使您最終使用其事務(wù)和查詢(xún)機(jī)制。 這不一定在所有情況下都是一件壞事,但是我個(gè)人對(duì)經(jīng)常使用的HQL語(yǔ)言感到不滿意,因?yàn)樗鼮殚_(kāi)發(fā)人員引入了一種熟悉的,不同的語(yǔ)言,其他人后來(lái)不得不維護(hù)并嘗試弄清楚出來(lái)。 查詢(xún)優(yōu)化也可能出現(xiàn)問(wèn)題,并且過(guò)去在性能調(diào)優(yōu)方面做了大量工作,對(duì)我來(lái)說(shuō),必須訪問(wèn)實(shí)際查詢(xún)以進(jìn)行調(diào)優(yōu)。 我還認(rèn)為,嘗試在持久性類(lèi)中實(shí)現(xiàn)繼承只是一個(gè)壞主意–試圖將一個(gè)概念強(qiáng)加到自然無(wú)法容納它的技術(shù)上是不值得的。 Hibernate誘使開(kāi)發(fā)人員通過(guò)支持按層次結(jié)構(gòu)表和按類(lèi)的機(jī)制在數(shù)據(jù)庫(kù)中實(shí)現(xiàn)繼承,但這在我心中是一個(gè)錯(cuò)誤,因?yàn)槟罱K會(huì)遇到不良的數(shù)據(jù)模型以及以后管理和擴(kuò)展層次結(jié)構(gòu)的問(wèn)題。 我也不喜歡填充應(yīng)該是干凈的關(guān)系模型-您不能假裝關(guān)系數(shù)據(jù)庫(kù)是面向?qū)ο蟮臄?shù)據(jù)存儲(chǔ)。
如果您從這篇文章中刪除了一件事,那就應(yīng)該是不要忽略您正在使用的實(shí)際技術(shù)。 對(duì)待RDBMS到底是什么,然后學(xué)習(xí)使用它。 對(duì)面向?qū)ο蟮南到y(tǒng)執(zhí)行相同的操作。 一定要嘗試通過(guò)使用ORM來(lái)避免編寫(xiě)樣板代碼和不必要的SQL,從而使您的生活更輕松,但不要認(rèn)為您可以避免處理某種翻譯或代碼來(lái)處理自然發(fā)生的不匹配。 不要期望使用框架或工具來(lái)為您解決問(wèn)題。 開(kāi)發(fā)人員會(huì)獲得思考和發(fā)現(xiàn)最佳方法的報(bào)酬,因此,當(dāng)問(wèn)題出現(xiàn)并聰明地解決它們時(shí),我們不必害怕進(jìn)行處理。 與許多事物一樣,此處適用80-20規(guī)則。 使用ORM可以為您完成80%的工作,并準(zhǔn)備為另外20%的工作編寫(xiě)SQL和一些持久性代碼。 不要期望太高,否則您最終會(huì)遇到幾種類(lèi)型的問(wèn)題-奇怪的錯(cuò)誤,性能問(wèn)題,設(shè)計(jì)不良的面向?qū)ο竽P偷取?
我很想聽(tīng)聽(tīng)您對(duì)任何語(yǔ)言的ORM的經(jīng)驗(yàn)和想法,遇到的問(wèn)題以及如何處理它們。 這是經(jīng)驗(yàn)非常寶貴的主題之一,因此請(qǐng)分享您的想法。
參考: 問(wèn)題與奧姆斯我們JCG伙伴 ■在Carfey軟件博客 。
相關(guān)文章 :
- 休眠陷阱
- 休眠自動(dòng)提交命令強(qiáng)制MySQL在過(guò)多的磁盤(pán)I / O中運(yùn)行
- Hibernate映射集合性能問(wèn)題
- DataNucleus 3.0與Hibernate 3.5
- Java Persistence API:快速入門(mén)
翻譯自: https://www.javacodegeeks.com/2011/09/problems-with-orms.html
總結(jié)
- 上一篇: 比亚迪汽车 8 月销量 274386 辆
- 下一篇: 使用内存映射文件获取巨大的矩阵