ORM的问题第2部分–查询

在我以前关于对象关系映射工具(ORM)的帖子中,我讨论了在处理当今常见的ORM(包括Hibernate)时遇到的各种问题。 其中包括与从POJO生成架构有关的问题,实际性能和不断出现的维护问题。 本质上,结论是ORM可以为您提供大部分帮助,但是需要一种平衡的方法,有时您只想避免使用ORM的工具集,因此您应该能够在需要时绕过它。

我看到的现代ORM的一个巨大缺陷是,它们确实希望帮助您解决所有SQL问题。 我是什么意思,为什么我要说这是一个错误? 好吧,我相信Hibernate等人只是太努力了 ,最终提供的功能实际上对开发人员的伤害大于对他们的帮助。 我所说的主要思想是查询支持。 ORM中严重缺乏对易于维护的复杂查询的实际支持,并不是因为它们省略了一些东西,而是因为它们提供的工具没有使用SQL,而SQL正是为此目的而专门设计的。

休眠的经验

我的经验是,当您使用HQL之类的功能时,经常会考虑节省几分钟的时间,这本身没有什么问题,但这可能会导致严重的问题。 根据我的经验,由于错误修复或增强功能,您常常经常想要或需要用更灵活的方式替换HQL,而这正是麻烦的开始。

我认为自己是一位经验丰富的开发人员,并且我为自己(通常)不打破事物而感到自豪-对我而言,这是优秀开发人员的标志之一。 当您面临着剥离一段代码并大范围地替换它(例如用SQL替换HQL)时,您基本上是在替换具有悠久历史的代码,这些历史记录包括错误修复,增强功能和性能调整。 现在,您有责任复制对此代码所做的所有更改,并且很可能您不了解更改的全部范围或过去已纠正的小问题。

请注意,这也适用于Hibernate提供的所有其他查询方法,包括Query API,以及扩展到JPA中的查询支持。 问题是您不希望解决方案过于脆弱或有限,而必须在以后完全替换。 这意味着,如果您需要恢复到SQL来完成任务,那么很有可能首先应该这样做。 相同的概念适用于软件开发的所有领域。
因此,如果像Hibernate这样的ORM中的基本查询支持不够好,我们的目标是什么?

坚实的ORM的标准

基本上,我对ORM的个人要求可以归结为以下几点:

  • 架构优先–从数据库生成模型,而不是相反。 如果您有一种与平台无关的方式来为数据库指定DDL,那很好,但这不是一个大问题。 从其他某些特定于域的语言或格式生成数据库不会帮助任何人,并且会导致设计不良的架构。
  • 仅限于SQL –如果您想帮助我避免编写代码,然后为我生成/公开基于密钥的查询等。 不要要求我使用您的查询API或某些新的查询语言。 SQL是为查询而发明的,所以让我使用正确的工具。
  • 给我简单的方法来从查询中填充域对象。 这给了我99%的需求,同时还给了我灵活性。
  • 请允许我用查询结果填充任意Java Bean –不要将我绑定到已知类型的注册表中。
  • 不要强迫我使用像Hibernate或Spring提供的那样的典型事务容器–它们是一场灾难,而且我从未见过对它们有意义的实际用途。 让我来处理在我的应用程序中获取和释放连接/事务的位置–通常,这仅在少数地方具有明确的语义发生。 这可以是JDBC的某些抽象版本,但让我控制它。
  • 我的域对象中没有聪明/神奇的行为–使用Hibernate时,我花了很多时间解决相同的旧代理和延迟加载问题。 它们永无止境,无法一劳永逸地解决,这表明存在严重的设计问题。

尽管这些观点对我来说似乎完全合理,但是我还没有遇到过任何真正符合我期望的ORM,因此在Carfey,我们推出了自己的小ORM,我不得不说周末的项目以及我们所拥有的只是总体发展比Hibernate或我使用的其他ORM更加容易和快捷。 它提供什么?

一个简单的功利主义ORM

  • Java域类是从数据库模式生成的。 尚无平台无关的DDL,但它在我们的TODO列表中。 Bean包括对子集合,FK引用的支持,但是它们都是惰性的和可选的-Bean支持它,但是如果您不使用它们,则不会产生影响。 如果需要,可以直接使用ID,也可以使用域对象本身。 持久性仅处理持久性脏对象,并且仅在请求时才保存-没有魔术冲洗行为。
  • 生成的域类仅用于持久性! 将您的业务逻辑等置于其他位置。
  • SQL用于所有查找,包括主键提取和外键关系。 如果需要增强查找,只需窃取生成的SQL并在其上进行构建即可。 方法和SQL是从任何索引列中自动生成的,因此它们都是为您自动提供的,并且是类型安全的。 这也向开发人员发出警告–如果您的域类中没有可用的查找,则由于索引不存在,查找性能可能会变差。
  • 可以以类型安全的方式从自定义查询中填充任何域类-灵活但易于使用。
  • 改进的类可隐藏标准的JDBC类型(例如ConnnectionStatement以简化易用性,但是我们不会对您施加任何事务语义,因此,您始终可以直接使用直接结果集处理。
  • 一些基本的必需功能,例如连接池,数据库元数据,以及很快的数据库从属故障转移。

Carfey的我们不相信我们创造了一些令人难以置信的新ORM,超越了所有其他工作,如果这是一个公共项目,我们必须添加许多功能,但是我们所拥有的功能对我们有用,并且我认为我们有正确的方法。 至少,希望我们的经验可以帮助您明智地选择使用首选ORM的方式,而不必花费太多时间来提供工具而不是交付软件。

最后要说明的是,如果您有满足上述需求清单的ORM的经验,并且您有很好的经验,那么我很乐意听到有关它的信息,并会考虑将其用于将来的Carfey项目。

参考: ORM的问题第2部分–来自我们JCG合作伙伴的 查询   Carfey软件博客上的 Craig Flichel。


翻译自: https://www.javacodegeeks.com/2012/02/problems-with-orms-part-2-queries.html

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

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

相关文章

【转】如何减少接口响应时间

Premature optimization is the root of all evil. — Donald Knuth 对于程序优化,我一直采取保守的态度,除非万不得已。但是随着业务的不断发展,程序越来越复杂,代码越写越多,优化似乎是终有一天会到来的事情。 那么对…

数据库行转列在现实需求中的用法

select t.客户姓名,sum(case when t.收款类型首款 then t.金额 else 0 end as 首款),sum(case when t.收款类型尾款 then t.金额 else 0 end as 尾款) from table t group by t.客户姓名 这段sql的意思 是 查询出所有客户收款信息 然后按客户分组 分组后 然后将这个客户的所…

mysql生产环境加索引_【生产篇】_MySQL环境下如何查看基于表的索引定义

【引言】今天中午项目组来一需求,欲在MySQL环境的某张表下创建几个BTREE索引。要创建索引,首先需要了解基表的表结构,以及已经包含的索引。Oracle的表结构大家都很熟悉,但MySQL表结构和已创建索引的查看怎么操作,本文将…

Hadoop模式介绍-独立,伪分布式,分布式

了解了什么是Hadoop之后,让我们在单机上启动Hadoop: 这篇文章包含在ubuntu上安装Hadoop的说明。 这是Hadoop安装的快速分步教程。 在这里,您将获得以独立模式 (单节点集群)安装Hadoop所需的所有命令及其说明&#xff0…

apk反编译方式

一、Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具。 apk反编译工具dex2jar,是将apk中的classes.dex转化成jar文件 源码查看工具jdgui…

优化Hibernate所鼓励的7大措施

优化Hibernate所鼓励的7大措施: 1.尽量使用many-to-one,避免使用单项one-to-many2.灵活使用单向one-to-many3.不用一对一,使用多对一代替一对一4.配置对象缓存,不使用集合缓存5.一对多使用Bag 多对一使用Set6.继承使用显示多态 HQ…

如何用c 控制mysql数据库_用C语言操作MySQL数据库

函数描述mysql_affected_rows()返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。mysql_autocommit()切换autocommit模式,ON/OFFmysql_change_user()更改打开连接上的用户和数据库。mysql_charset_name()返回用于连接的默认字符集的…

数据结构(RMQ):POJ 3624 Balanced Lineup

Balanced LineupDescription For the daily milking, Farmer Johns N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a conti…

Apache Thrift快速入门教程

Thrift是一种跨语言RPC框架,最初是在Facebook上开发的,现在作为Apache项目开源。 这篇文章将描述如何以不同的模式(例如阻塞,非阻塞和异步)编写Thrift服务和客户端。 (我觉得后两种模式的文档较少&#xff…

数组拆分为新数组

package com.classes;//已知数组a,将奇数位置元素存到b数组中,偶数位置元素存到c数组中public class Shuzu1118_4 { public static void main(String[] args) { int [] a{3,6,9,1,4,7,2,5,8}; int [] b; //定义数组b int [] c; //定义数组c//先找出数组…

java数组交集_java数组的交集和并集

前两天给我出了一道题,求数组的并集和交集,然后我试着写一下,很尴尬,由于长时间没有写过代码,一开始数组是如何定义的给忘了。当时我说了我的思路,不过也是很low的做法,查阅网上的一些资料&…

ADF声明性组件示例

在我以前的文章中,我答应展示如何为智能值列表创建ADF声明性组件。 因此,我将创建一个包含三个元素的组件:标签,输入文本和值的组合框列表。 那很容易。 我在工作空间中创建了一个单独的ADF ViewController项目: 在此项…

VS2015 安装包缺失(联网安装失败)问题解决

Win7 x86 测试可行 * 如果前面有尝试过安装不成功, 一定要用卸载程序删除已安装的部分,否则会出乱子. 1. 或者是用虚拟光驱加载ISO, 或者是解压到硬盘上, 都没有关系. 2. 用管理员权限启动CMD控制台, 进入VS2015 安装盘的根目录 (vs_enterprise.exe 所在的目录). 3. 执行命令 …

java蓝桥暑假班_Java实现 蓝桥杯VIP 算法提高 班级排名

算法提高 班级排名时间限制:1.0s 内存限制:256.0MB问题描述达达在陶陶的影响下,也对学习慢慢的产生了兴趣。他在每次考试之后,都会追着老师问,自己在班级的总名次是多少。考试一多,老师也不耐烦了&#xff…

$.ajax所犯的错误。success后面不执行

$.ajax({ type: post, url: ../AshxHandler/HandlerAddPhoto.ashx, data: { clientPath: photoName }, dataType: text, cache: false, success: function (data) { alert(1); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(上传图片出现错误&#xf…

WhateverOrigin –与Heroku和Play对抗相同的原产地政策! 构架

不久前,我在编码 Bitcoin Pie时发现需要克服臭名昭著的Same Origin Policy ,该政策限制了运行在客户端浏览器上的javascript可以访问的域。 通过Stack Overflow,我找到了一个名为Any Origin的站点,这基本上是无需设置专用服务器即…

Solr集群更新配置的方式

solr集群中配置文件是经常更新的,频率最高的也就是schema.xml和solrconfig.xml这两个配置文件了,对于更新配置文件之前,我们先了解一下集群项目结构 由于在集群模式下,solrconfig.xml和schema.xml等配置文件都由Zookeeper集群管理…

java文本框双击可编辑_java swing 文本域双击变为可编辑

java swing如何实现文本域双击变为可编辑呢?给文本域添加鼠标事件监听程序即可:resultTA1new AssistPopupTextArea();resultTA1.setEditable(false);resultTA1.setLineWrap(true);resultTA1.setWrapStyleWord(true);resultTA1.addMouseListener(new MouseAdapter() {Overridep…

点击出现黑色背景的解决

-webkit-tap-highlight-color:rgba(0,0,0,0);转载于:https://www.cnblogs.com/luckyXcc/p/6085582.html

OSGi简介–模块化Java

OSGi联盟是这一搁浅的管理机构,它始于1999年。其最初目标是为网络设备创建开放搁浅。 基于此思想,此规范也针对Java引入。 Eclipse在Java中是第一个。 他们于2004年6月推出了基于OSGi的Eclipse IDE。 OSGi是在Java中定义动态模块的方法。 主要为Java实现…