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软件博客 。

相关文章 :

  • Hibernate陷阱
  • Hibernate自动提交命令强制MySQL在过多的磁盘I / O中运行
  • Hibernate映射集合性能问题
  • DataNucleus 3.0与Hibernate 3.5
  • Java Persistence API:快速入门

翻译自: https://www.javacodegeeks.com/2011/09/problems-with-orms.html

orm框架选型问题

orm框架选型问题_ORM问题相关推荐

  1. java orm框架什么意思_ORM框架是什么

    ORM框架是什么 对象关系映射,目前数据库是关系型数据库  ORM 主要是把数据库中的关系数据映射称为程序中的对象 目前集中常见的ORM框架 1  Nhibernate 原因:用的比较多,资料也比较好 ...

  2. Java orm框架的优缺点_ORM框架简介及优缺点

    一.ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使用描述对象和数据 ...

  3. atitit.orm的缺点与orm框架市场占有率,选型attilax总结

    atitit.orm的缺点与orm框架市场占有率,选型attilax总结 1. attilax的orm框架要求 1 2. orm框架市场占有率 2 3. spring jdbc templt 3 4. ...

  4. ORM框架如何选型——各大ORM框架比较

                                             ORM框架如何选型--各大ORM框架比较 现有ORM框架或ORM相关框架主要有Hibernate,Mybatis.这两 ...

  5. java orm框架 博客园_ORM框架的前世今生

    目录 一.ORM简介 二.ORM的工作原理 三.ORM的优缺点 四.常见的ORM框架 一.ORM简介 ORM(Object Relational Mapping)对象关系映射,一般指持久化数据和实体对 ...

  6. .net core orm框架_轻量级高性能PHP框架ycroute

    YCRoute 目录 框架介绍 运行环境 代码结构 路由配置 过滤验签 控制层 加载器 模型层 数据交互dao层(可选) Redis缓存操作 数据库操作 配置加载 公共类加载 公共函数 日志模块 视图 ...

  7. Nodejs相关ORM框架分析

    概述 写这篇blog的原因,想找个node的ORM框架用用,确很难找到一篇对比分析这些ORM框架的文章,唯一找到了一篇,居然是通过star数来论英雄,我觉着很难服众,于是就找几个看看.后来又不想分析, ...

  8. Golang框架选型比较: goframe, beego, iris和gin

    由于工作需要,这些年来也接触了不少的开发框架,Golang的开发框架比较多,不过基本都是Web"框架"为主.这里稍微打了个引号,因为大部分"框架"从设计和功能定 ...

  9. PetaPoco - 轻量级高性能的ORM框架(支持.NET Core)

    我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db. 而且市面上的orm框架有很多,有重量级的Entity Framework,有 ...

最新文章

  1. 旷视提Circle Loss,统一优化视角,革新深度特征学习范式 | CVPR 2020
  2. ajax post提交数据_如何用前端知识获取数据,制作一个微信订餐后台案例?
  3. bzoj1003 物流运输
  4. edx错误的地方开始安装
  5. Python面试题40问
  6. c++/cli之我见
  7. JVM调优:JVM内存分代模型
  8. 【转】C#委托事件浅析
  9. webpack入门进阶调优第一章
  10. java实现矩阵相乘
  11. FreeModbus离散量输入
  12. 一窥 ARM 的 AI 处理器
  13. 深入浅出设计模式(C#/Java版)
  14. pcb板led正负极图形_晶体二极管正负极判断_晶体二极管图形符号
  15. 关于后端接口测试没问题,HTTP500错误
  16. 阿根廷-10月摩托车行业实现正增长(+23.4%)
  17. 查看电脑使用了多长时间
  18. CSS中的line-height,height与line-height
  19. 大数据的特点:5个V
  20. 整理全菜30篇学习vue和脚手架的笔记

热门文章

  1. Redis(案例一:注册登录-图形验证码+谷歌开源Kaptcha)
  2. 2020蓝桥杯省赛---java---B---2(寻找 2020)+测试txt
  3. 2016蓝桥杯省赛---java---B---3(平方怪圈)
  4. 按钮右对齐_Python Tkinter Button按钮
  5. 多智能体强化学习_基于多智能体强化学习主宰星际争霸游戏
  6. inner join on 加条件和where加条件_SQL学习笔记 - GROUP BY / JOIN / UNION
  7. python测试开发面试题_python测试开发面试之深浅拷贝
  8. 机器学习性能评估指标(综合性总结)
  9. java 白皮书的关键术语
  10. system.gc 性能_使用这些先进的GC技术提高应用程序性能