ORM仇恨者無法理解

我看過無數的文章和評論(尤其是評論),它們告訴我們ORM(對象關系映射)的概念有多糟糕,糟糕和錯誤。 以下是通常的聲明,以及我對它們的評論:
  • “它們很慢” –映射有一些開銷,但這并不嚴重。 您可能會擁有慢得多的代碼段。
  • “它們會產生不利于性能的錯誤查詢” –首先,它產生的查詢要比常規開發人員編寫的查詢更好,其次–如果您使用錯誤的映射,則會產生錯誤的查詢
  • “它們剝奪了您的控制權” –您可以自由執行本機查詢
  • “您不需要它們,普通的SQL和XDBC很好” –不,但是我將在下一段中討論
  • “它們迫使您使用不好的吸氣劑和吸氣劑” –您的實體是簡單的價值對象, 在那里使用吸氣劑/吸氣劑就可以了 。 下面的更多內容
  • 數據庫升級非常困難– ORM周圍有很多工具可以簡化架構轉換。 許多ORM都內置了這些工具
但是,為什么首先需要一個ORM? 假設您決定不使用一個。 您編寫查詢并以ResultSet的形式(或使用您所使用語言的任何形式)將結果取回。 您可以在那里通過其名稱訪問每一列。 結果是類型不安全的類似地圖的結構。 但是系統的其余部分需要對象–前端組件需要對象,服務方法需要對象作為參數,等等。這些對象是簡單的值對象,并且通過getter公開它們的狀態沒有錯。 他們沒有對狀態進行操作的任何邏輯,它們只是用來轉移狀態。 如果您使用的是靜態類型的語言,則很可能在代碼周圍使用對象而不是類型不安全的結構,更不用說這些結構是數據庫訪問接口,并且您不會在前端使用它們碼。 因此,您想到了一個絕妙的主意–“我將創建一個價值對象,并將結果集中的所有內容轉移給它。 現在,我將數據保存在一個對象中,不需要在數據庫中傳遞特定于接口的接口來傳遞代碼。” 這是偉大的一步。 但是很快您就意識到這是一項重復性的任務–您正在創建一個新對象,并逐字段手動進行操作,將結果從SQL查詢傳遞到該對象。 然后,您設計了一個巧妙的反射實用程序,該實用程序可以讀取對象字段,并假定您在數據庫中具有相同的列名,讀取結果集并填充對象。 好吧,猜猜是什么–多年來,ORM一直在做同樣的事情。 我敢打賭他們的更好,并且可以在許多您認為不需要的場景中工作。 (而且我只是簡單地說明了維護本地查詢的過程有多奇怪-有些將它們放在一個巨大的文本文件中(難看),而另一些則將它們放在行內(DBA現在如何優化它們?))
總結上一段–您將在項目中創建某種ORM,但是您的項目將比那里吸收的更多,并且您不會承認它是ORM。
這是提到稱為commons-dbutils (Java)的實用程序的好地方。 它是將數據庫結果映射到涵蓋基本情況的對象的簡單工具。 它不是ORM,但它執行ORM的工作–將數據庫映射到您的對象。 但是基本的列到字段映射器中缺少一些東西,那就是外鍵和聯接。 使用ORM,即使需要JOIN來獲取它,也可以在“地址”字段中獲取用戶的地址。 這既是ORM的優點,也是主要的缺點。 * ToOne映射通常是安全的。 但是* ToMany集合可能非常棘手,并且經常被濫用 。 這部分是ORM的錯誤,因為ORM不會以任何方式警告您映射某個公司的所有訂單的集合的后果。 您將永遠也永遠不需要訪問該集合,但是可以對其進行映射。 我從未從ORM反對者那里聽到過這樣的爭論,因為他們還沒有達到這一點。
那么,ORM基本上是dbutils加上危險的集合映射嗎? 不,它為您提供了許多所需的其他功能。 方言–您以與數據庫無關的方式編寫代碼,盡管您可能不會更改最初選擇的數據庫供應商,但是使用任何數據庫都容易得多,而無需每個開發人員都了解語法的罪魁禍首。 我曾經使用過MSSQL和Oracle,但與他們合作幾乎沒有痛苦。 另一個非常非常重要的事情是緩存。 您會執行兩次相同的查詢嗎? 我猜不是,但是如果碰巧是在第三個方法調用的兩個單獨的方法中,則可能很難捕獲或避免。 會話緩存來了,它將為您保存所有重復的查詢,以便從數據庫中獲取某些行(對象)。 這里對ORM還有另一種批評–會話管理太復雜了。 我主要使用JPA,因此我無法透露其他信息,但是正確地進行會話管理確實很棘手。 都是出于很好的理由(前面提到的緩存,事務管理,延遲映射等),但是它仍然太復雜了。 您需要團隊中至少有一個對特定ORM有豐富經驗的人員來正確地進行設置。
但是還有二級緩存,這要重要得多。 這種事情可以使facebook和twitter之類的服務存在–將很少變化的數據填充到(分布式)內存中,而不是每次都查詢數據庫,而是從內存中獲取對象,這快了很多倍。 為什么這與ORM相關? 因為通常可以將緩存解決方案插入ORM,并且您可以將ORM生成的對象完全存儲在內存中。 通過這種方式,緩存對您的數據庫訪問代碼變得完全透明,從而使其簡單而高效。
因此,總而言之– ORM仍在做您需要做的事情,但是幾乎可以肯定的是,存在10年的框架比您自己的映射器要好,并且它們在頂部提供了許多必要且重要的附加功能他們的核心功能。 他們也有兩個弱點(他們實際上都說“您需要知道自己在做什么”):
  • 它們很容易被濫用,這可能導致從數據庫中獲取大量不必要的結果。 您可以非常輕松地創建app腳的映射,這會減慢您的應用程序的速度。 當然,擁有一個良好的映射是您的責任,但是ORM并沒有真正幫助您
  • 他們的會話管理很復雜,盡管有很好的理由,但可能需要團隊中經驗豐富的人才能正確地進行設置
我從未見過將這兩個用作反對ORM的論據,而本文開頭的錯誤用法卻經常被使用,這使我相信,對ORM狂熱的人們很少知道他們在說什么。
參考: ORM Haters不要從Bozho的技術博客博客上的JCG合作伙伴 Bozhidar Bozhanov那里 得到它 。

翻譯自: https://www.javacodegeeks.com/2012/05/orm-haters-dont-get-it.html

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

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

相關文章

Android之仿微信圖片選擇器

先上效果圖。第一張圖顯示的是“相機”文件夾中的所有圖片;通過點擊多張圖片可以到第二張圖所示的效果(被選擇的圖片會變暗,同時選擇按鈕變亮);點擊最下面的那一欄可以到第三張圖所示的效果(顯示手機中所有…

oracle 快照用途,Oracle快照原理及實現總結

oracle數據庫的快照是一個表,它包含有對一個本地或遠程數據庫上一個或多個表或視圖的查詢的結果。也就是說快照根本的原理就是將本地或遠程數據庫上的一個查詢結果保存在一個表中。以下是建立的Snapshot,目的是從業務數據庫上將數據Copy到處理數據庫上&a…

loss function

什么是loss? loss: loss是我們用來對模型滿意程度的指標。loss設計的原則是:模型越好loss越低,模型越差loss越高,但也有過擬合的情況。   ??loss function: 在分類問題中,輸入樣本經過含權重矩陣θ的模型后會得出關于各個類別…

復雜的(事件)世界

這篇博客文章試圖總結CEP領域中的技術,并探討它們的主要功能和不足。 有時似乎過度使用了CEP一詞(就像ESB一樣),下面的文章反映了我們對它的理解和理解。 ESPER( http://esper.codehaus.org/ )是流行的開源…

oracle查詢表的id,oracle 查看所有用戶及密碼 實現Oracle查詢用戶所有表

1、oracle 查看所有用戶及密碼SQL> select username from dba_users;2、 實現Oracle查詢用戶所有表下面為您介紹的語句用于實現Oracle查詢用戶所有表,如果您對oracle查詢方面感興趣的話,不妨一看。select * from all_tab_comments-- 查詢所有用戶的表…

php 字符串加密與解密

/** * param $data 需要加密的字符串 * param $key 加密的密碼 * return string 加密后的字符串 */function _encrypt($data, $key){ $key md5($key); $x 0; $len strlen($data); $l strlen($key); $char; $str; for ($i …

java如何從方法返回多個值

本文介紹三個方法,使java方法返回多個值。 方法1:使用集合類方法2:使用封裝對象方法3:使用引用傳遞示例代碼如下: import java.util.HashMap; import java.util.Map;public class Test {/*** 方法1:使用集合…

FindBugs和JSR-305

假設那組開發人員在大型項目的各個部分上并行工作–一些開發人員在進行服務實現,而其他開發人員在使用該服務的代碼。 考慮到API的假設,兩個小組都同意服務API,并開始單獨工作。 您認為這個故事會有幸福的結局嗎? 好吧&#xff0c…

java使用org.apache.poi讀取與保存EXCEL文件

一、讀EXCEL文件 1 package com.ruijie.wis.cloud.utils;2 3 import java.io.FileInputStream;4 import java.io.FileNotFoundException;5 import java.io.IOException;6 import java.io.InputStream;7 import java.text.DecimalFormat;8 import java.util.ArrayList;9 import …

oracle 指定格式化,Oracle中的格式化函數

格式化函數提供一套有效的工具用于把各種數據類型(日期/時間,int,float,numeric)轉換成格式化的字符串以及反過來從格式化的字符串轉換成原始的數據類型。表 5-6. 格式化函數函數返回描述例子to_char(datetime, text)text把datetime 轉換成 s…

彈性數組

看這個結構體的定義:typedef struct st_type{ int nCnt; int item[0];}type_a;(有些編譯器會報錯無法編譯可以改成:)typedef struct st_type{ int nCnt; int item[];}type_a; 這樣我們就可以定義一個可變長的結…

什么是Akka?

在深入研究什么是Akka之前,讓我們退后一步來了解并發編程的概念在應用程序開發世界中是如何演變的。 應用程序已經從大型的整體程序演變為面向對象的模型。 隨著Java EE和Spring框架的出現,應用程序設計演變為更多的基于流程或任務的設計模型。 EJB或Poj…

apache2服務器搭建心得

網站的配置文件在/etc/apache2/sites-avalible中,每個文件對應一個虛擬站點,但需要在/etc/apache2/sites-enabled中創建軟鏈接到sites-avalible中對應的文件。 起初我在sites-avalible中創建了兩個站點,一個netaddi.com,一個test.…

has_a php,PHP has encountered a Stack overflow問題解決方法

昨晚將一個disucz論壇進行轉移后,發現打開的頁面上回多一個PHP has encountered a Stack overflow 這個提示錯誤,進過翻譯為“PHP遇到堆棧溢出”。我就感覺奇怪了,新站沒人訪問的,怎么可能會溢出。 好吧去discuz官方論壇找找解決方…

解決ueditor jquery javascript 取值問題

代碼如下: var content UE.getEditor(myEditor).getContent();myEditor是ueditor 的名稱name。代碼如下: <textarea name"myEditor" id"myEditor"></textarea><script type"text/javascript">var editor new UE.ui.Editor()…

異常處理準則和最佳實踐

讓我們回顧一些從對象設計總結的基本異常設計準則&#xff1a;角色&#xff0c;職責和協作&#xff08;Rebecca Wirfs-Brock和Alan McKean&#xff0c;Addison-Wesley&#xff0c;2003年&#xff09;。 不要嘗試處理編碼錯誤。 除非在錯誤情況下要求您的軟件采取特殊措施&…

HDU 5225 枚舉

題目鏈接&#xff1a; hdu:http://acm.hdu.edu.cn/showproblem.php?pid5225 bc(中文):http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid580&pid1002 題解&#xff1a; 數組a保存輸入 考慮當前位i&#xff0c;對于1<j<i&#xff0c;使得x[j]a[…

河南上oracle客戶,解決Oracle監聽服務報錯

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓如果只是本機的訪問 sqlplus system/manager這樣是沒有問題的。但是如果使用 sqlplus system/managerorcl的時候卻會報ora-12514的錯誤。解決方法&#xff1a;1. 打開D:\oracle\product\10.2.0\db_1/network/admin/listener.ora文件…

【BZOJ2073】[POI2004]PRZ 狀壓DP

【BZOJ2073】[POI2004]PRZ Description 一只隊伍在爬山時碰到了雪崩,他們在逃跑時遇到了一座橋,他們要盡快的過橋. 橋已經很舊了, 所以它不能承受太重的東西. 任何時候隊伍在橋上的人都不能超過一定的限制. 所以這只隊伍過橋時只能分批過,當一組全部過去時,下一組才能接著過. 隊…

運行時vs編譯時類路徑

這確實應該是一個簡單的區別&#xff0c;但是我一直在回答有關Stackoverflow的許多類似問題&#xff0c;并且經常有人誤解此事。 那么&#xff0c;什么是類路徑&#xff1f; 應用程序所需的一組所有類&#xff08;以及帶有類的jar&#xff09;的集合。 但是有兩個或實際上三個不…