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