JPA –我应该成为懒惰的极端主义者吗?

当您与开发人员讨论将对象映射到关系数据库时,他们经常抱怨JPA性能差,JPA提供程序的行为不可预测等。通常,在对话的某些时候,您会听到: “让我们完全放弃这项技术,我们在上个月的会议上看到了更好的东西。 我们将在我们的项目中使用它而不是JPA,并从此以后快乐地开发它们。” - 听起来很熟悉? 学习新技术没错,事实上,您应该不断地做下去,以提高您的技能和知识,但是当您遇到其中一种问题时,您会选择一条通向另一种技术的简单途径还是会问自己: “我是吗? 以正确的方式使用它?” 让我们看一下JPA用法示例。 假设我们有简单的数据库,映射到实体:

而且我们必须显示所有员工姓名,无论其雇主(和部门)如何。 没有比这容易的事了-简单的JPQL查询就能做到:

select employee from Employee employee order by employee.name

许多开发人员在这一点上完成工作,并与Friends一起庆祝他们生活中另一个成功的JPQL查询,但是我们当中有些人感到这种奇怪的感觉,即有些令人毛骨悚然的东西潜伏在光亮的表面之下。 JPA提供程序(例如Hibernate)产生的SQL查询将揭示事实:

select [...]  from EMPLOYEE employee0_ order by employee0_.EMPLOYEE_NAMENothing special, so far , but here comes the naked truth:select [...] from DEPARTMENT department0_ left outer join EMPLOYER employer1_ on department0_.EMPLOYER_ID=employer1_.EMPLOYER_ID where department0_.DEPARTMENT_ID=?select [...] from EMPLOYER employer0_ where employer0_.EMPLOYER_ID=?select [...] from DEPARTMENT department0_ left outer join EMPLOYER employer1_ on department0_.EMPLOYER_ID=employer1_.EMPLOYER_ID where department0_.DEPARTMENT_ID=?select [...] from DEPARTMENT department0_ left outer join EMPLOYER employer1_ on department0_.EMPLOYER_ID=employer1_.EMPLOYER_ID where department0_.DEPARTMENT_ID=?select [...] from DEPARTMENT department0_ left outer join EMPLOYER employer1_ on department0_.EMPLOYER_ID=employer1_.EMPLOYER_ID where department0_.DEPARTMENT_ID=?

有没有搞错?! 这些查询是什么? –好吧,原因在于@ManyToOne批注的默认访 属性值,即EAGER 。 我的数据库包含2个雇主,其中一个拥有4个部门,而第二个则没有。 加载Employee时,默认情况下,JPA提供程序会加载所有EAGER关联(在我们的示例中是Department和Employer),因此我们还有其他查询。 如上所示,JPA提供者足够聪明,可以在可能的情况下立即加载雇主和部门。

您刚刚发现了神奇的JPQL查询,可一次获取所有数据库内容 。 这种情况会让您想起过去的事情吗? 我们对于它可以做些什么呢? –我的朋友,您所需要的只是懒惰–除非真正需要,否则不要使用EAGER (请记住, @ ManyToOne@OneToOne注释默认使用它)。

此时您可能称我为疯子或懒惰极端主义者,并问:您是否遇到过LazyInitializationException ,兄弟! 您是否听说过延迟加载问题的所有麻烦!? 性能下降等。。。我当然这样做了,但是您不认为如果我们在JPA方面遇到麻烦,也许我们会以错误的方式使用它! 我们通常在Web应用程序中所做的是在UI上呈现或编辑一些数据,并且通常只是特定实体属性的一小部分。 要做到这一点,需要从数据库中获取实体树–我们不知不觉中就问实体管理器:给我所有员工,按名称排序,以及所有相关实体,然后抱怨性能下降! 我们不在乎从数据库中获取什么,因为实体管理器将为我们完成驴工作。 我们得到LazyInitializationException ,那么! 我们将以“视图”模式使用“打开实体管理器”,并消除此愚蠢的异常!

休息一下! 你不认为这是一个死胡同吗? –现在该改变一些东西了。 您可以在项目中使用复杂的方法,例如CQRS ,以及JPA中已经存在的可能性,这些方法可以帮助您更改本文中我描述的不良方式。

甜点的几个链接:

  • CQRS信息
  • 马丁·福勒(Martin Fowler)关于CQRS的文章

参考: JPA –我应该成为懒惰的极端主义者吗? 来自我们的JCG合作伙伴 Michal Jastak,来自Warlock's Thoughts博客。

翻译自: https://www.javacodegeeks.com/2013/05/jpa-should-i-become-a-laziness-extremist.html

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

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

相关文章

mysql恢复 报错_Mysql 数据恢复报错

1.测试mysql binlog 数据恢复功能,我的mysql版本是5.7.172.删了数据之后,执行show binlog events 命令得到如下记录3.找到开始删除和结束删除的位置,然后执行恢复命令:mysqlbinlog --no-defaults --start-position8991 --stop-position290468…

IONIC

1.项目摘要  随着移动互联网的不断发展,移动端流量所占比例已经越来越高。下图来自IResearch所做的关于移动互联网的市场调研报告 由此我们可以看出,移动互联网在人们生活中的位置越来越重要。 受益于国家“提速降费”以及即将取消流量漫游的优惠政策&…

line-height与图片底部间隙的学习整理转述

前言:这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方,请大家指正,我会持续更新! 看大牛张鑫旭的视屏可能会理解的更深一些,点击这里; line-height,两行文字的基线之间的距离&…

java学习之异常之格式

第一个格式: try{}catch(){} 第二个格式: try{}catch(){}finally{} 第三个格式: try{}finally{} 注意:catch是用于处理异常,如果没有catch就代表异常没有被处理过,如果该异常是检测时异常,那么必…

分数DRL:在OptaPlanner中更快,更轻松

对于OptaPlanner ( Drools Planner)6.0.0.Beta1,我已经用更优雅的ConstraintMatch系统替换了ConstraintOccurrence。 结果是您的DRL评分文件为: 快多了 更容易读写 错误的发生率要低得多,因为它们使分数损坏变得更加…

mysql 的数据库实例理解_理解数据库和实例

数据库:物理操作系统文件或者其他形式文件类型的集合。在mysql中,数据库文件可以是frm、MYD、MYI、ibd等结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统文件,而是存放于内存之中的文件。实例:mysql数据库由…

STM32 环境搭建

从之前的51,到后来的AVR,再到现在的STM32,处理器的处理能力在不断的提高,我们也跟随着处理器一步一步的玩到了STM32 目前STM32的开发环境很多,常用的例如Keil,IAR等,但是这些软件都是收费的&…

css常用属性初总结:伪元素和伪元素

前面几遍中我们分别说到了id选择器和class选择器,以及它们的区别和联系,下面大家一起来探究一下神奇的为类和伪元素吧。 其实以前我对伪类和伪元素也是搞得稀里糊涂的,现在决定剥开它神秘的外衣,首先,究竟什么是伪类&…

Java 8:CompletableFuture的权威指南

Java 8即将到来&#xff0c;因此该学习新功能了。 尽管Java 7和Java 6只是次要的发行版&#xff0c;但版本8将向前迈出一大步。 也许太大了&#xff1f; 今天&#xff0c;我将为您详细介绍JDK 8中的新抽象– CompletableFuture<T> 。 众所周知&#xff0c;Java 8有望在不…

mysql数据库工程师网易微专业_网易MySQL数据库工程师微专业学习笔记(五)

一、mysql数据库中的存储引擎mysql在创建数据表时可以通过engine关键字设置存储引擎的类型&#xff0c;也可以通过alter命令来修改表的存储引擎。可以通过show engines命令来查看当前mysql数据库支持的存储引擎的类型&#xff0c;一般场景的存储引擎有&#xff1a;InnoDB、MyIS…

Java并发编程笔记之ConcurrentLinkedQueue源码探究

JDK 中基于链表的非阻塞无界队列 ConcurrentLinkedQueue 原理剖析&#xff0c;ConcurrentLinkedQueue 内部是如何使用 CAS 非阻塞算法来保证多线程下入队出队操作的线程安全&#xff1f; ConcurrentLinkedQueue是线程安全的无界非阻塞队列&#xff0c;其底层数据结构是使用单向…

03 Day Python数据类型

一&#xff1a;什么是数据&#xff1f; x10&#xff0c;10是我们要存储的数据 2 为何数据要分不同的类型 数据是用来表示状态的&#xff0c;不同的状态就应该用不同的类型的数据去表示 3 数据类型 数字 字符串 列表 元组 字典 集合 二&#xff1a;数字int #bit_length() 当十进…

border三角形阴影(不规则图形阴影)和多重边框的制作

前言&#xff1a;这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方&#xff0c;请大家指正&#xff0c;我会持续更新&#xff01; 1. border的组合写法 border&#xff1a;border-width border-style border-color; border-width&#xff1a;边框宽度&#xff0…

JDK 8 Javadoc调整了方法列表

自开始以来&#xff0c; Javadoc输出基本上是静态HTML&#xff0c;具有导航链接和外观的简单样式表样式。 Java SE 7很长时间以来就看到Javadoc输出默认外观的第一个重大变化 &#xff0c;现在看来JDK 8将在生成的Javadoc输出上引入新的变化。 在本文中&#xff0c;我将通过JDK…

hdp安装 不安装mysql_hdp安装及使用问题汇总(一)

1)安装HDP时&#xff0c;如果打印如下错误信息&#xff1a;[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:579)是由于系统的python版本过高&#xff0c;导致验证ssl失败&#xff0c;将python降级为2.7.5以下或修改每个安装节点的python证书验证配置文件…

PhotoSphereViewer 全景图

1网站地址&#xff1a;http://photo-sphere-viewer.js.org/markers.html#demo 2参数中文地址&#xff1a;https://www.cnblogs.com/big-tree/p/5933437.html 使用方法&#xff1a; /*** Initialize the viewer*/ var PSV new PhotoSphereViewer({ // main configuration panor…

常用Lunix命令

计算机 1.硬件系统 输入单元、输出单元、算术逻辑单元、控制单元、记忆单元 中央处理单元&#xff1a;CPU&#xff08;算术逻辑单元、控制单元&#xff09; 电源、主板、CPU、内存&#xff08;RAM&#xff09;、硬盘、&#xff08;声卡、显卡、网卡&#xff09;&#xff08;集成…

angularJS constant和value

angularJS可以通过constant(name,value)和value(name,value)对于创建服务也是很重要的。 相同点是&#xff1a;都可以接受两个参数&#xff0c;name和value。 区别&#xff1a; 1.constant(name,value)可以将一个已经存在的变量值注册为服务&#xff0c;并将其注入到应用的其他…

让我们编写一个文档样式的Web服务

您可能知道&#xff0c;我们可以使用四种主要的Web服务样式。 它们如下&#xff1a; 文件/文学 包装的文件/文学 RPC /编码 RPC /文字 当然&#xff0c;现在不建议使用RPC /编码样式。 如果您有兴趣&#xff0c;可以在此处找到这篇非常全面的文章&#xff0c;以了解不同的…

linux 进入容器,查看和关闭进程

1&#xff0c;linux 查询容器 ID&#xff1a; docker ps 2&#xff0c;进入容器&#xff08;退出 exec 命令用&#xff1a;[ctrlD] &#xff0c;不会终止容器运行。退出 top 命令&#xff1a;ctrl C&#xff09; docker exec -it c39c9d3898c0 /bin/bash 3&#xff0c;查询进程…