jooq_jOOQ与Hibernate:何时选择哪个

jooq

Hibernate已成为Java生态系统中的事实上的标准,事实上, 如果标准对您很重要 ,并且如果您将JCP与ISO,ANSI,IEEE等置于同一级别,那么Hibernate也是实际的JavaEE标准实现。

本文的目的不是讨论标准,而是讨论愿景。 Hibernate赞同JPA的ORM愿景。 jOOQ拥有SQL强大查询的愿景,因此,为了争辩,让我们互换使用Hibernate / JPA / ORM,就像jOOQ / JDBC / SQL一样。

为什么现在应该有人使用Hibernate的问题经常出现 -正是因为Hibernate是事实上的标准,并且是许多其他框架(例如Grails( 使用GORM,又使用Hibernate ))中的第一个框架选择。

但是,即使是Hibernate的创建者Gavin King,也不认为Hibernate应该用于所有方面

加文·金

如果是这样,您是否可以考虑任何客观的决策帮助点,何时使用ORM以及何时使用SQL?

高水平的讨论

首先,让我们将讨论提高到更高的水平。 与其在Hibernate和jOOQ之间确定它们各自域的具体实现,不如考虑ORM与SQL以及它们的不同用例。

在确定ORM(例如Hibernate)和SQL(例如jOOQ)之间时,您应该问自己的驱动问题不是项目复杂性问题。 我们一些要求最苛刻的客户正在对具有数千个表/视图的中型架构使用jOOQ。 通常,这些模式被极端标准化,有时甚至部署在多达六个不同的RDBMS上。 jOOQ专为在这些情况下工作而设计,同时也牢记了简单的用例。

因此,与其考虑项目的复杂性,不如问自己以下问题:

  1. 您的数据模型将驱动您的应用程序设计,还是您的应用程序设计将驱动您的数据模型?
    这里的一个主要方面是从数据库是否可以在您的应用程序中生存的角度来考虑您是否“关心”数据库的问题。 很多时候,应用程序来来往往。 它们可能会用Python / JavaScript等重写,直到5年后。 或者,您有多个应用程序访问同一个数据库:Java应用程序,一些Perl脚本,存储过程等。在这种情况下,数据库设计是您项目中的优先事项,而jOOQ在这些设置中工作得非常好。从某种意义上说,您不一定要“关心”您的数据库,而只是想在某个地方“持久化”您的Java域,而这恰好是一个关系数据库,那么Hibernate也许是一个更好的选择-至少在项目的早期阶段,因为您可以轻松地从Entity模型生成数据库架构。
  2. 您将主要从事复杂的阅读和简单的写作,还是从事复杂的写作?
    当阅读很复杂时,SQL确实会发光。 当您联接许多表时,当您在数据库中聚合数据时,当您进行报告时,当您进行批量读取和写入时。 您是从集合论的角度来考虑数据的,例如您的数据整体。 但是,用SQL编写CRUD很无聊。 这就是为什么jOOQ还为您提供了一个ActiveRecord风格的API来处理无聊的部分(当您在单个表上进行操作时(Jason提到过))。但是,如果您的编写变得复杂,即您必须加载一个复杂的对象图,其中包含20个涉及内存的实体,对其进行乐观锁定,以多种不同方式对其进行修改,然后再次将其持久保存,那么SQL / jOOQ将无济于事。 这就是Hibernate最初创建的目的。

意见

我相信数据是永远的。 您应该*始终*假定数据库在应用程序中仍然存在。 重写应用程序(的一部分)比迁移数据库要容易得多。 拥有一个干净且设计良好的数据库架构将始终使项目,特别是复杂项目的收益得到回报。 另请参阅我们先前有关“无模式”数据库的谬误的文章 。

而且,大多数项目实际上完成90%的读取和10%的写入,写入通常并不复杂(在事务中修改2-3个表)。 这意味着大多数时候,不需要Hibernate / JPA的一级和二级缓存解决的复杂性。 人们常常会误解这些功能,而只是关闭缓存,将Hibernate的缓存一直刷新到服务器,从而以错误的方式使用Hibernate。

但是,如果您不确定上述两个决策轴,则可以走中间路线,仅将jOOQ用于报告,批处理等,并将Hibernate用于CRUD –在CQRS(命令查询责任隔离)中: http://martinfowler.com/bliki/CQRS.html )样式。 也有很多jOOQ用户选择了此路径。

进一步阅读

  • 吞吐量与复杂性–什么时候应该使用ORM? 由Mike Hadlow
  • 为什么要使用ORM? 比尔·卡文(Bill Karwin)
  • 是否有充分的理由不使用ORM? 堆栈溢出
  • 为什么要使用ORM? 堆栈溢出

翻译自: https://www.javacodegeeks.com/2015/03/jooq-vs-hibernate-when-to-choose-which.html

jooq

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

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

相关文章

C语言 | 循环语句总结

C语言循环的嵌套一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环体中还可以嵌套循环,这就是多层循环。3种常用循环语句:while语句、do...while语句和for语句可以相互嵌套。C语言循环的比较3种循环语句都可以用来处理同一…

账户的配置使您无法使用该计算机,2个方法解决“user profile service服务未能登录无法加载用户配置文件”...

win8/10系统:启动电脑显示windows标志时,长按电源键强行关机,重复此操作三次,系统将会进入“自动修复”。然后在“自动修复”界面中,选择“高级选项”>“疑难解答”>“高级选项”>“启动设置”>“重启”&a…

C语言 | 内部与外部函数

C语言函数的声明和定义一个函数一般由两部分组成:声明部分执行语句C语言对变量而言,声明与定义的关系稍微复杂一些,在声明部分出现的变量有两种情况:一种是需要建立存储空间的。另一种是不需要建立存储空间的。前者称为定义性声明…

获取客户端ip_代理IP工具能否解决反爬?

互联网已成了生活中的部分,从事互联网的工作者,避免不了需要去一些网站上进行爬取需要的数据来达到自己产品或者业务上的需求。比如反爬策略,但是,使用代理IP工具一定可以解决反爬虫策略吗?一、不同的网站有不同的反爬…

C语言 | 结构体数组

C语言结构体数组概述一个结构体变量中可以存放一组有关联的数据,如一个学生的学号、姓名、成绩等数据,如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。结构体数组与之前介绍的数值型数组的不同之处在于每个数…

html弹窗代码y\/n,Nodejs扩展,实现消息弹窗(示例代码)

模块的C代码 node_gtknotify.cc#include #include #include #include #include using namespace v8;class GtkNotify : node::ObjectWrap{public:GtkNotify(){}~GtkNotify(){}std::string title;std::string icon;static Persistent persistent_function_template;static void …

C语言 | 结构体指针

C语言指向结构体变量的指针在C语言中,指向结构体对象的指针变量既可以指向结构体变量,也可指向结构体数组中的元素。指针变量的基类型必须与结构体变量的类型相同。C语言中允许 (*p).num用p->num来代替 ->代表一个箭头 p-&g…

C语言 | 变量的存储方式

C语言动态存储方式与静态存储方式静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式;动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式。内存中的供用户使用的存储空间可以分为3部分,程序区静态存储区动态存储区全局变量…

设计模式装饰者模式_装饰者模式如何拯救了我的一天

设计模式装饰者模式在工作中,我正在处理庞大的Java代码库,该代码库是由许多不同的开发人员在15年的时间里开发的。 并不是所有的事情都由书来完成,但是同时我通常无法重构遇到的每一个奇怪的事物。 尽管如此,仍可以每天采取提高代…

初学者选黑卡还是微单_明日之镜 十年索尼微单和他的镜头王国

2010年索尼微单诞生,与之一同而来的还有全新的E卡口。十年间,E卡口从APS-C走向了全画幅,从静态影像走向了专业摄像。并且准瞬间通过机器与机器、镜头与镜头架起了消费级与专业级的桥梁。想来一个卡口创作无限界大抵就是如此吧。起源一枚扫街用…

C语言 | 字符数组

C语言字符数组的定义字符数组是用来存放字符数据的数组,字符数组中的一个元素存放一个字符,定义字符数组的方法和定义数值型数组的方法类似。//例子:char character[10];C语言字符数组的初始化C语言对字符数组初始化,最容易理解的…

linux暗转旧版java_Java旧版不断发展

linux暗转旧版java最近&#xff0c;我偶然发现了JDK API的一个非常有趣的警告&#xff0c;即Class.getConstructors()方法。 它的方法签名是这样的&#xff1a; Constructor<?>[] getConstructors()有趣的是&#xff0c; Class.getConstructor(Class...)返回一个Constr…

C语言和指针的本质是什么?技术大神给出答案

很多编程语言都以 “没有指针” 作为自己的优势来宣传&#xff0c;然而&#xff0c;对于C语言&#xff0c;指针却是与生俱来的。那么&#xff0c;什么是指针&#xff0c;为什么大家都想避开指针。很简单&#xff0c; 指针就是地址&#xff0c;当一个地址作为一个变量存在时&…

fastdfs的tracker启动之后一直选举_jraft选举策略

一、角色划分Follower&#xff1a;完全被动&#xff0c;不能发送任何请求&#xff0c;只接受并响应来自leader 和 candidate 的 message&#xff0c;每个节点启动后的初始状态一定是follower&#xff1b;Leader&#xff1a;处理所有来自客户端的请求&#xff0c;以及复制 log到…

C语言 | 二维数组

C语言二维数组的定义一般形式 类型说明符 数组名[常量表达式][常量表达式]int a[10][6],b[3][4];用矩阵形式表示二维数组&#xff0c;是逻辑上的概念&#xff0c;能形象地表示出行列关系&#xff0c;而在内存中&#xff0c;各元素是连续存放的&#xff0c;不是二维的&#xff0…

C语言 | 一维数组

C语言一维数组的定义一般形式类型符 数组名[常量表达式]C语言使用一维数组注意事项数组名的命名规则和变量名相同&#xff0c;遵循标识符命名规则。在定义数组时&#xff0c;需要指定数组中元素的个数&#xff0c;方括号中的常量表达式用来表示元素的个数&#xff0c;即数组长度…

怎样删去csv中重复行_4个锦囊,祝你快速删去Excel中的重复数据

快速删去重复数据&#xff0c;雷哥在这里提供4种超简单的解决方法&#xff0c;大家一看就会。为了更加直接明了地说明&#xff0c;雷哥在这里通过具体案例进行讲解。案例&#xff1a;下图B列日期中&#xff0c;橘黄色部分是我们已经标记好颜色的重复项。要求&#xff1a;快速删…

C语言通过printf()设置输出显示方式

在调试程序时多数情况下要输出很多提示信息&#xff0c;通过控制输出字体的颜色的显示方式可以方便我们快速查看有用的信息&#xff0c;而printf()的终端转义就为我们提供了这样的手段。我们大家知道在程序结尾加上\n就可在输出的时候换行&#xff0c;其实这就是个转义字符。而…

如何取消计算机阻止安装程序,Win10电脑安装软件提示“你必须取消阻止该发布者才能运行此软件”怎么办...

&#xfeff;我们在使用win10系统的时候&#xff0c;都会在电脑中安装各种各样的软件&#xff0c;但是有时候在安装软件的还是&#xff0c;会遇到一些提示&#xff0c;比如“你必须取消阻止该发布者才能运行此软件”&#xff0c;导致安装软件失败&#xff0c;这该怎么办呢&…

perl大骆驼和小骆驼_快速的骆驼和云消息传递

perl大骆驼和小骆驼Apache Camel是一个流行的&#xff0c;成熟的开源集成库。 它实现了企业集成模式 &#xff0c;这是在集成分布式系统时经常出现的一组模式。 过去&#xff0c;我写过很多关于Camel的文章&#xff0c; 包括为什么我比Spring Integration更喜欢它 &#xff0c;…