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.mzph.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…