ORM問題

在過去的幾年中,像Hibernate這樣的對象關系映射工具已經幫助開發人員在處理關系數據庫方面取得了巨大的生產力增長。 ORM使開發人員可以將精力集中在應用程序邏輯上,并避免為諸如插入或查詢之類的簡單任務編寫大量樣板SQL。

但是,充分證明的對象關系阻抗不匹配問題不可避免地引起開發人員的頭痛。 關系數據庫是建立在合理概念基礎上的一種專門技術,但是它們不一定符合面向對象的世界。 有幾種使用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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374517.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374517.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ActiveMQ中Session設置的相關理解

名詞解釋: P:生產者 C:消費者 服務端:P 或者 ActiveMQ服務 客戶端:ActiveMQ服務 或者 C 客戶端成功接收一條消息的標志是這條消息被簽收。成功接收一條消息一般包括如下三個階段: 1.客戶端接收…

python中的 descriptor

學好和用好python, descriptor是必須跨越過去的一個點,現在雖然Python書籍花樣百出,但是似乎都是在介紹一些Python庫而已,對Python語言本身的關注很少,或者即使關注了,但是能夠介紹把 dscriptor介紹清楚的&…

Heroku運行Java

如果您是像我這樣的Java迷,那么您有個好消息值得振奮。 Heroku現在運行Java! 嗯,與其他流行的“ Web”語言(如PHP / RoR)不同,Java具有在Web服務器中進行部署和維護的麻煩。 一直以來,只有企業才…

配置了坐標還是找不到serv_為什么老人家總是這疼那疼,還找不到原因?是矯情還是另有原因...

“哎呀,怎么回事,腰痛腿痛的,痛的我一晚上都沒怎么睡覺,怎么回事昨天也沒干嘛啊!”對于這一句話,相信很多朋友都不是很陌生。這句話是來自于一位網友的留言,而說這話的真是她的媽媽。這也是很多…

Nginx負載均衡和LVS負載均衡的比較分析

lvs和nginx都可以用作多機負載的方案,它們各有優缺,在生產環境中需要好好分析實際情況并加以利用。 首先提醒,做技術切不可人云亦云,我云即你云;同時也不可太趨向保守,過于相信舊有方式而等別人來幫你做墊被…

QuartZ.net 常用配置說明

配置文件說明app.config中的quartz部分<quartz><!-- configure Thread Pool--><addkey"quartz.threadPool.type"value"Quartz.Simpl.SimpleThreadPool,Quartz" /><addkey"quartz.threadPool.threadCount"value"10&quo…

qopenglwidget 透明_廊坊透明真空袋用途-祺泰包裝

功能方面&#xff1a;平面真空袋抽真空后易形成不平整&#xff0c;不均勻的現象。目前&#xff0c;真空包裝主要用于食品的包裝&#xff0c;如肉類、谷類加工食品以及易氧化變質的食品&#xff0c;也可用于機械零件、儀器和羽絨制品、毛制品等蓬松制品的包裝。在超shi中&#x…

使用Spring Data Neo4j進行領域建模

大家好&#xff0c;威利在這里。 上次我告訴您&#xff0c;我正在使用Neo4j和Spring Data Neo4j構建Skybase CMDB&#xff0c;我很高興收到很多對此的積極反饋。 我展示了一些代碼&#xff0c;但沒有那么多。 在本文中&#xff0c;我將向您展示如何使用Spring Data Neo4j在Skyb…

mysql 阿里內核人員

丁奇 http://dinglin.javaeye.com/鳴嵩 曹偉-鳴嵩 (新浪微博)彭立勛 http://www.penglixun.com/皓庭 http://wqtn22.iteye.com/項仲 http://blog.csdn.net/wudongxu劍川 http://gaoyusong.com/武藏 http://ybbct.iteye.com/祁奚 http://i.mtime.com/844165/褚霸 http://blog.y…

linux基本命令學習

1. 執行文件&#xff1a; ./文件 &#xff1a;執行該文件 sh startup.sh 執行該文件 2. Vi編輯 vi命令&#xff1a; :w 保存文件但不退出 :w file 將修改另外保存到file中&#xff0c;不退出 :w! 強制保存&#xff0c;不推出 :wq 保存文件并退出 :wq! 強制保存文件&#xff0…

506. 相對名次

方法一 復制數組排序返回對應下標 class Solution {public String[] findRelativeRanks(int[] score) {int n score.length;int[] newScore Arrays.copyOf(score,n);Arrays.sort(newScore);String[] res new String[n];for(int i 0;i<n;i){int rank Arrays.binarySear…

Java壓縮

在最近的項目中&#xff0c;我們不得不做一些我個人從未真正看過的事情。 壓縮。 我們需要拍幾個文件和圖像&#xff0c;將它們壓縮并提供給FTP使用&#xff0c;是的&#xff0c;總有一天&#xff0c;感覺確實回到了90年代。 除了過去的FTP之行外&#xff0c;它還是一個很好的機…

蘇州面對公司發布

假設您對我們這種創業型公司和我們的發展方向感興趣的話&#xff0c;我們希望通過以下10個問答進一步添加兩方的了解。我們希望看到的是您經過深思熟慮的、對公司和自己的前途負責任的謹慎回答。而不是應付公差式的輕描淡寫&#xff08;我們會依據您回答質量的高低決定是否邀請…

linux多線程_Java+Linux,深入內核源碼講解多線程之進程

之前寫了兩篇文章&#xff0c;都是針對Linux這個系統的&#xff0c;為什么?我為什么這么喜歡寫這個系統的知識&#xff0c;可能就是為了今天的內容多線程系列&#xff0c;現在多線程不是一個面試重點 啊&#xff0c;那如果你能深入系統內核回答這個知識點&#xff0c;面試官會…

594. 最長和諧子序列

和諧數組是指一個數組里元素的最大值和最小值之間的差別 正好是 1 。 現在&#xff0c;給你一個整數數組 nums &#xff0c;請你在所有可能的子序列中找到最長的和諧子序列的長度。 數組的子序列是一個由數組派生出來的序列&#xff0c;它可以通過刪除一些元素或不刪除元素、…

解決git clone報錯SSL certificate problem

Git新手一枚&#xff0c;今天進行git clone操作時發生如下問題&#xff1a;提示無效的鏈接error: SSL certificate problem: Invalid certificate chain while accessing https://githib.com/...XXXX.git fatal: HTTP request failed解決方法也很簡單&#xff0c;一條命令就搞定…

使用內存映射文件獲取巨大的矩陣

總覽 矩陣可能真的很大&#xff0c;有時甚至比一個數組中可以容納的更大。 您可以通過具有多個數組來擴展最大大小&#xff0c;但這會使堆大小確實很大且效率低下。 一種替代方法是在內存映射文件上使用包裝器。 內存映射文件的優點是它們對堆的影響很小&#xff0c;并且可以由…

ipad連接電腦_這些應用讓iPad生產力分分鐘UP

IT時報見習記者 錢奕昀用iPad辦公這件事&#xff0c;多年前網友就在討論&#xff0c;最常見的還是那句“買前生產力&#xff0c;買后愛奇藝”。很長一段時間里&#xff0c;它的生產力屬性都是弱于娛樂屬性的。其實&#xff0c;作為PC端和移動端的形態中和&#xff0c;iPad可以…

Mac OSX 快捷鍵命令行

ctrlshift 快速放大dock的圖標會暫時放大&#xff0c;而如果你開啟了dock放大CommandOptionW 將所有窗口關閉CommandW 將當前窗口關閉(可以關閉Safari標簽欄,很實用) CommandOptionM …

將JavaFX 2.0與Swing和SWT集成

JavaFX 2.0對JavaFX的改進之一是可以更輕松地與Swing和SWT進行互操作 。 一些在線資源記錄了如何完成此操作。 其中包括將JavaFX集成到Swing應用程序和SWT Interop中 。 但是&#xff0c;在有效的類級Javadoc文檔的一個很好的示例中&#xff0c;各自的JavaFX類javafx.embed.swi…