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,两行文字的基线之间的距离&…

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

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

STM32 环境搭建

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

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

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

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

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

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

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

JDK 8 Javadoc调整了方法列表

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

angularJS constant和value

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

将JacpFX客户端与JSR 356 WebSockets一起使用

JSR 356 WebSockets是即将发布的JEE 7版本中令人兴奋的新功能之一,并且在其参考实现中包括Server-和Client API。 这使其非常适合在客户端与JavaFX集成。 JacpFX是JavaFX之上的RCP框架,它使用基于消息的方法与组件进行交互。 这种基于消息的方法使集成We…

《精通Spring4.X企业应用开发实战》读后感第七章(AOP概念)

转载于:https://www.cnblogs.com/Michael2397/p/8068486.html

Material使用04 MdCardModule和MdButtonModule综合运用

设计需求:设计一个登陆页面 1 模块导入 1.1 将MdCardModule和MdButtonModule模块导入到共享模块中 import { NgModule } from angular/core; import { CommonModule } from angular/common; import { MdSidenavModule, MdToolbarModule,MdIconModule,MdButtonModule…

python实现bp神经网络对csv文件进行数据预测

参考资源: sklearn库 bp神经网络[从原理到代码一篇搞定](2)_sklearn 神经网络-CSDN博客 十分钟上手sklearn:安装,获取数据,数据预处理 - 知乎 (zhihu.com) 一个实例讲解如何使用BP神经网络(附代码) - 知…

Spring MVC:表单处理卷。 4 –单选按钮

在软件开发领域,单选按钮是图形用户界面的重要组成部分。 Spring MVC标签库为此表单元素提供了特殊标签。 更确切地说,有两个标签用于此目的:单选按钮,单选按钮。 两者对于特定任务都是有用的。 如您所知,我将在帖子中…

点击时候确定某个元素 js_某空气质量监测平台 JS反爬

目标:中国空气质量在线监测分析平台|城市分析 参考CSDN中文章,记录一下学习过程通过切换城市,页面数据是通过 Ajax 加载的,数据接口:https://www.aqistudy.cn/apinew/aqistudyapi.php请求的POST Data、返回的数据都被加…

HTML 部分常用属性、组成属性|...超链接、路径、锚点、列表、滚动、URL编码、表格、表单、GET和POST

URL地址 就是我们所说的网址:www.jd.com 浏览器内核,渲染引擎 Ie内核:triteent 谷歌/欧鹏:blink 火狐:gecko 苹果:webkit 渲染引擎是出现兼容性的根本问题 -html概念:hyper Text Markup Languag…

Spring @Value取值为null或@Autowired注入失败

Value 用于注入.properties文件中定义的内容 Autowired 用于装配bean 用法都很简单,很直接,但是稍不注意就会出错。下面就来说说我遇到的问题。 前两天在项目中遇到了一个问题,大致描述就是我写了如下一个类(只列出关键代码&#…

mysql 部门表_MySQL高级

本文大纲环境win10-64MySQL Community Server 5.7.1mysqld –version可查看版本官方文档SQL执行顺序手写顺序我们可以将手写SQL时遵循的格式归结如下&#xff1a;select distinct from join on wheregroup byhavingorder bylimit <offset>,<rows>distinct&…

使用Apache Camel发布/订阅模式

发布/订阅是一种简单的消息传递模式&#xff0c;其中&#xff0c;发布者将消息发送到某个频道&#xff0c;而无需知道谁将接收消息。 然后&#xff0c;通道负责将消息的副本传递给每个订户。 此消息传递模型允许创建松耦合和可伸缩的系统。 这是一种非常常见的消息传递模式&am…