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

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

为什么现在应该使用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,该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与Hibernate:何时选择哪个相关推荐

  1. jpa 根据主键生成策略获取id_如何在使用JPA和Hibernate时选择id生成策略

    MMTTMM 该API文档都对这个很清楚.所有生成器都实现了org.hibernate.id.IdentifierGenerator接口.这是一个非常简单的界面.一些应用程序可以选择提供自己的专用实现 ...

  2. Hibernate事实:始终检查Criteria API SQL查询

    Criteria API对于动态构建查询非常有用,但这是我使用它的唯一用例. 每当您有一个带有N个过滤器且可以以任意M个组合到达的UI时,就应该有一个API动态地构造查询,因为连接字符串始终是我所不愿 ...

  3. 2021最新Java面试题(Hibernate面试题、MyBatis面试题、Spring面试题、SpringMVC面试题)

    1.什么是 ORM 框架? 答:对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境 ...

  4. Hibernate搭建成功!(源码)

    昨天晚上搭建了我的第一个Hibernate框架.感觉挺爽的! 虽然两天还不会连接数据库,昨就把那么帅的东西搞出来了. 感觉很爽,Java真的很好,很强大.我学习Java才一个月左右,我还有许多需要学习 ...

  5. Hibernate各种主键生成策略与配置详解 - 真的很详细啊!!

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  6. Hibernate Tools 学习总结

    Hibernate Tools for Eclipse的使用 http://blog.csdn.net/gaojinshan/article/details/39502509 Hibernate To ...

  7. 【转】Hibernate和IBatis对比

    原文地址:http://blog.csdn.net/ya2dan/article/details/7396598 项目也做过几个, 使用IBatis就做一个项目, 基本上都是使用Hibernate, ...

  8. Hibernate依赖包简单介绍

    http://wqbi.itpub.net/post/2966/61574 很多书都没有怎么介绍Hibernate依赖的jar包,这篇文章算是说的比较全吧. Hibernate一共包括了23个jar包 ...

  9. Struts2与Spring、Hibernate三者整合的过程示例

    转载地址:http://www.360doc.com/content/09/0416/09/61497_3148602.shtml# 原来spring配置文件自动生成数据源和整合先后有关系,留着做个提 ...

最新文章

  1. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)
  2. unit2--unit4单元文档
  3. 暑假N天乐【比赛篇】 —— 2019杭电暑期多校训练营(第四场)
  4. java调用keras theano模型_使用Keras获得模型输出的梯度w.r.t权重
  5. python之collections之有序字典(OrderedDict)
  6. 1. 栈和队列的数组实现
  7. 【分享-windows文件快速搜索神器】Everything 免费、快速搜索文件/文件夹
  8. 信息学奥赛一本通(1217:棋盘问题)
  9. 视频教程-【企业定制课】AI软件illustratorCC应用与平面印刷视频教程-UI
  10. 联想年报有看头:供应链展现韧性,PC迎来新机遇
  11. 12款好用超赞的国外搜索资源网站 ,开发者们的标配,你都知道吗?不知道就OUT了...
  12. [推荐]中国网管的知识宝库-网管之家
  13. Python彩色字符画
  14. 关于AD与KiCad绘制PCB的一点看法
  15. (五)具名和匿名挂载
  16. cython编译python_Cython编译python为so 代码加密示例
  17. The bean ‘dataTokenMapper‘ could not be injected because it is a JDK dynamic
  18. Android常见内存泄漏以及解决办法
  19. 智掌柜带你了解餐饮点菜系统的功能,快来看看吧~
  20. Error: Unknown command: cask 解决方法

热门文章

  1. FastDFS(分布式文件系统)
  2. React中的各个目录文件功能
  3. Mybatis中使用Dao实现类实现增删改查【实际开发中使用代理dao】
  4. ReviewForJob——堆排序
  5. 异常java.lang.Thread.dumpStack(Unknown Source)
  6. JavaWeb核心常用API一览
  7. jvm gc,gc算法_GC解释:算法
  8. rxjava 背压_背压加载文件– RxJava常见问题解答
  9. drill apache_使用Apache Drill REST API通过Node构建ASCII仪表盘
  10. jboss8日志级别设置_罐中研讨会:设置JBoss BRMS全日研讨会