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.mzph.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;的集合。 但是有两个或实际上三个不…