orm框架选型问题_ORM问题

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框架选型问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iwifi 命令

1: tftp -gr ctwancfg.html 192.168.1.18转载于:https://www.cnblogs.com/gavinwu/p/4221790.html

JBoss BPM Travel Agency演示与现代BPM数据集成

不久前,我们启动了一个规模较大的JBoss Travel Agency演示项目,以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 ,不仅向您展示了如何安装它,项目中各种规则和流程工件的含义,还向您介绍了在实际使用…

京东php asp,jd jd demo 关于php的代码里面是 一些京东的接口 包含了 重要 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...

开发工具: PHP文件大小: 183 KB上传时间: 2013-04-15下载次数: 1详细说明:jd demo 关于php的代码里面是关于一些京东的接口里面的代码包含了一些重要-jd demo about php code jingdong interface文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评…

scala入门-10 隐式转换、隐式参数、隐式类

到目前为止,隐式转换是scala的重点和难点了,加油~ 我们先创建一个类名称叫Implicit.scala 再看一个隐式参数的例子: 上面的例子中使用了隐式参数,我们也可以明显的指明参数: 下面看一下隐式类: 相当于&…

抢答网页PHP,[抢答]抢答环节已结束,相关答案已封箱 - 薅羊毛(Coupon)版 - 北大未名BBS...

mojave (你说得都对) 在 ta 的帖子中提到:抢答活动已经全部结束。截止目前,以下题目的正确答案不足5个:第9题、第22题、第23题等。封盘时间为今晚23:00。各位可以在封盘之前继续回答。另外我们提醒大家,如果一题中有多个回答&…

连载《一个程序猿的生命周期》-2.城市校园生活

一个程序猿的生命周期 微信平台 口 号:职业交流,职业规划;面对现实,用心去交流、感悟。 公众号:iterlifetime 百木-ITer职业交流奋斗 群:141588103 微 博:http://www.weibo.com/u/57234…

jvm锁_JVM如何处理锁

jvm锁当我们谈论最新版本的Sun Hotspot Java虚拟机1.6时,当您尝试从java.util.concurrent.locks.Lock实现获取锁或输入同步块时,JVM将执行以下三种锁类型: 有偏见的 :有时,即使在并发系统中也没有争用,并且…

excel使用MySQL数据,如何使用mysql完成excel中的数据生成

Excel是数据分析中最常用的工具,本篇文章通过mysql与excel的功能对比介绍如何使用mysql完成excel中的数据生成,数据清洗,预处理,以及最常见的数据分类,数据筛选,分类汇总,以及数据透视等操作。本…

究竟什么是语法糖呢

其实语法糖只是一个概念,大家可能很早就在接触语法糖了,只是一直不知道这个就是语法糖 百科原话:语法糖(Syntactic sugar),是由Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算,由此而创立了函数式编程…

Spring Batch –使用JavaConfig替换XML作业配置

我最近协助一个客户启动并运行了Spring Batch实现。 该团队决定继续为批处理作业使用基于JavaConfig的配置,而不是传统的基于XML的配置。 随着这越来越成为配置Java应用程序的一种常用方法,我觉得是时候更新Keyhole的Spring Batch系列了 ,向您…

php使用accdb,php如何连接access2007的accdb格式数据库文件?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼header("Content-type: text/html; charsetGBK");/*数据库路径,请自己修改,否则可能运行不正常*/$conn new COM("ADODB.Connection") or die("ADO连接失败!");$connstr "PROVIDER…

Karrigell 入门教程

http://wenku.baidu.com/link?urlPG3sP0mnKt-RPLxEPktTtqTsMlCflOwSTdOEgti21pnFaed1K_MSd4Xx-Z-ZvkgyTvIwWFTB1dEy1eQ9gKyIwIVMeKEiforBbVykW0Y2SM_ 讲karrigell 3.1.1,目录结构和2.x版本不一样了。新版本里面是没有Karrigell.ini 文中提到admin目录下有一个模块…

php autoload用法,php自动加载__autoload()函数用法

autoload在php主版本中是自动加载文件的一个方法了我们可以定义许多的文件在目录然后通过autoload加载了,下面来看看autoload函数用法。在PHP5之后,我们可以通过 __autoload来解决这个问题。 而且在PHP5.1之后,还提供了 spl_autoload_registe…

jaxb xsd生成xml_使用JAXB从XSD生成XML

jaxb xsd生成xml这是最初由JCG合作伙伴 Experiences Unlimited的Mohamed Sanaulla发表的帖子。 Mohamed解释了如何使用JAXB从给定的XSD生成XML 。 (注意:对原始帖子进行了少量编辑以提高可读性) 我们可以使用JAXB使用给定的Schema将Java对象…

oracle 10g客户端连接11g,生产环境oracle10g升级至11g准备工作

主要有以下的步骤 :1.new ORACLE_HOME(11g), old ORACLE_HOME (10g)--这些需要提前提供给客户,作为基本的约定2.install oracle software 11.2.0.2.0 on production--总共有7个DB,时间很紧,所以准备要充分3.apply DB patch additional if nee…

JBoss BPM Travel Agency的微服务迁移故事

不久前,我们启动了一个规模较大的JBoss Travel Agency演示项目,以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 ,不仅向您展示了如何安装它,项目中各种规则和流程工件的含义,还向您介绍了在实际使…

windows快捷操作

命令行启动或关闭VMWare服务: net start VMwareHostdVMAuthdServiceVMUSBArbService"VMware NAT Service"VMnetDHCP#启动VMware虚拟机服务net start VMwareHostdnet start "VMware NAT Service"net start VMnetDHCPcmd#停止VMvare虚拟机服务net…

oracle 打印值,oracle – 在SQL Developer中打印变量的值

我想打印一个特定变量的值在一个匿名块内。我使用Oracle SQL Developer。我尝试使用dbms_output.put_line。但它不工作。我使用的代码如下所示。SET SERVEROUTPUT ONDECLARECTABLE USER_OBJECTS.OBJECT_NAME%TYPE;CCOLUMN ALL_TAB_COLS.COLUMN_NAME%TYPE;V_ALL_COLS VARCHAR2(5…

【leetcode】Combinations (middle)

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example,If n 4 and k 2, a solution is: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 思路:有点像0-1背包问题, 对于从1-n的每一个数字都可以选择放入…

oracle 批量读,Oracle批量读取数据和批量绑定

通常我们获取游标数据是用fetch some_cursor into var1, var2 的形式,自 Oracle 8i 起,Oracle 为我们提供了fetch bulkcollect 来批量取游标中的数据,它能在读取游标中大量数据的时候提升效率,采用bulkcollect可以将查询结果一次性…