jpa 查询集合_避免懒惰的JPA集合

jpa 查询集合

Hibernate(实际上是JPA)具有集合映射:@ OneToMany,@ ManyToMany,@ ElementCollection。 默认情况下,所有这些都是惰性的。 这意味着集合是List或Set接口的特定实现,其中包含对持久性会话的引用,并且只有在访问集合时才从数据库中加载值。 如果您仅偶尔使用集合,则可以节省不必要的数据库查询。

但是,这有一个问题。 在我看来,异常是第二个最常见的异常(在NullPointerException之后),即LazyInitializationException。 问题在于会话通常为您的服务层打开,并且在您将实体返回到视图层后立即关闭。 而且,当您尝试在视图中迭代未初始化的集合时(例如jsp),该集合将引发LazyInitializationException,因为它们所拥有的引用所在的会话已经关闭,并且无法获取项目。

如何解决? 所谓的OpenSessionInView / OpenEntityManagerInView“模式”。 简而言之:您可以创建一个过滤器,以在请求开始时打开会话,并在呈现视图后(而不是在服务层完成之后)关闭会话。 有人称其为反模式,因为它将持久性处理泄漏到视图层,并使设置复杂化。 我不会说那么糟糕:通常,它可以解决问题而不引入其他问题。 但是在我参与的所有最新项目中,我们没有使用OpenSessionInView,而且效果很好。

之所以能正常工作,是因为我们没有使用惰性集合。 但是,您会正确地指出,当您加载单个实体时,您将获取“整个世界”。 好吧,不。 * ToMany映射有两种类型:

  • 值类型映射,其中集合在逻辑上不包含十几个元素。 在大多数情况下,这是@ElementCollection,还有@ * ToMany,带有诸如“ Category”或“ Price”之类的项目,它们只是更复杂的值对象,但自身不包含任何其他映射。 这些类型的集合的另一个共同特征是它们通常与它们自己的实体一起显示在UI中。 例如,您最有可能要显示文章的类别。 对于这种类型的集合,EAGER是更好的选择。 无论如何,您都必须获取它们,为什么不让Hibernate(或任何jpa实现)想到一些巧妙的连接呢? 就像我说的那样-逻辑上集合不超过一打或十二个,因此获取它们不会对性能造成影响。 而且,从逻辑上讲,它们不会与它们一起获取大对象图。
  • 大型核心实体之间的映射。 可以是“用户下的所有订单”或“组织中的所有用户”,“供应商的所有项目”等。您当然不想急于获取它们。 因为如果您为一个组织获取2000个用户,那么每个组织又有1000个订单,而一个订单平均有3个项目,这反过来又包含所有购买该项目的人的集合。.您将最终拥有整个数据库在记忆中。 显然您需要惰性集合,对吗? 好吧,不。 在这种情况下,您根本不应该使用集合映射。 在99%的情况下,这些类型的关系都显示在UI的页面列表中。 或在搜索结果中。 它们永远不会(也永远不会)全部显示在一个屏幕上(或者,如果您的应用程序提供了类似REST API之类的东西,则很少应该在一个API调用中返回它们)。 您必须对其进行查询,并使用query.setMaxResults和query.setFirstResult()(或使用一些限制性条件来限制它们)。 此外,对集合进行映射意味着有人会在某个时候尝试使用它们,这可能会失败。 如果对象已序列化(xml,json等),则将获取集合内容。 您几乎肯定不想发生的事情。 (这里的想法草案:JPA可以有一个PagedList集合,该集合将允许分页的延迟提取,从而消除了查询的需要)

所以,我刚才说的是-永远不要使用惰性集合。 将eager集合用于非常简单的浅表映射,将分页查询用于较大的映射。

好吧,不完全是。 延迟集合在那里并且它们有应用,尽管它是相当有限的。 或者,至少它们比使用的方法适用性差。 这是我发现适用的示例场景。 在我的附带项目中,我有一个Message实体,它拥有一个Picture实体的集合。 用户上载图片时,它会存储在该图片集中。 一条消息的图片不得超过10张,因此该收藏非常渴望获得。 但是,Message是最常用的实体–实际上是在每个请求中获取的。 但是只有一些消息带有图片(您的信息流中有多少条推文有图片上传?)。 因此,我不想让Hibernate状态进行查询只是为了查找给定消息没有图片。 因此,我将图片数量存储在一个单独的字段中,使图片集合变得懒惰,只有在图片数量> 0时才手动对其进行Hibernate.initialize(..)。

因此,在某些情况下,当实体具有属于上述第一类的可选集合时(“小型浅表集合”)。 因此,如果它很小,很浅并且是可选的(例如,在不到20%的情况下使用),则应该使用Lazy来保存不必要的查询。

其他方面–懒惰的收藏会让您的生活更艰难。

参考:在Bozho的技术博客上, 避免与我们的JCG合作伙伴 Bozho一起使用懒惰的JPA Collections 。

相关文章 :

  • Hibernate陷阱
  • DataNucleus 3.0与Hibernate 3.5
  • Hibernate映射集合性能问题
  • ORM问题
  • 框架使开发人员愚蠢吗?
  • 每个程序员都应该知道的事情
  • Java最佳实践

翻译自: https://www.javacodegeeks.com/2011/10/avoid-lazy-jpa-collections.html

jpa 查询集合

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

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

相关文章

graph面板x轴模式包括哪些_发那科数控车床面板讲解

数控机床操作面板是数控机床的重要组成部件,是操作人员与数控机床(系统)进行交互的工具,主要有显示装置、NC键盘、MCP、状态灯、手持单元等部分组成。数控车床的类型和数控系统的种类很多,以及各生产厂家设计的操作面板也不尽相同&#xff0c…

前端全栈大佬是如何使用javaScript实现一个无缝轮播优化

效果图: 代码如下: <!DOCTYPE html> <html> <head lang="en"><meta charset="UTF-8"><title>优化后的无缝轮播图</title><style>body{-webkit-user-select: none; }ul,li{list-style: none;}#outer{width: 4…

74cms 5.0.1版本文件包含漏洞复现

漏洞成因&#xff1a;由于74CMS 某些函数存在过滤不严格&#xff0c;攻击者通过构造恶意请求&#xff0c;配合文件包含漏洞可在无需登录的情况下执行任意代码&#xff0c;控制服务器。 下载地址&#xff1a; http://www.74cms.com/download/index.html下载后解压到phpstudy的根…

给Java程序猿们推荐一些值得一看的好书

学习的最好途径就是看书 "学习的最好途径就是看书"&#xff0c;这是我自己学习并且小有了一定的积累之后的第一体会。个人认为看书有两点好处&#xff1a; 1、能出版出来的书一定是经过反复的思考、雕琢和审核的&#xff0c;因此从专业性的角度来说&#xff0c;一本好…

pr基本图形模板无法使用_PR模板21个时尚排版竖屏封面图形标题动画【资源分享1218】...

AE特效PR剪辑C4D动画影视后期全世界只有不到1%的人关注了你是个很特别的人AE影视后期定期推送「AEPRC4D 影视特效合成 婚庆剪辑调色 电视广告包装 微电影制作 SpeedGrade达芬奇专业调色 摄影等」打造影视后期高端学习平台影视后期 ID&#xff1a;AEPRC4D6【PR模板信息】适用软件…

前端全栈大佬是如何使用javaScript实现一个无缝轮播(最终版)

效果图: 代码如下: <!DOCTYPE html> <html> <head lang="en"><meta charset="UTF-8"><title>优化后的无缝轮播图</title><style>body{-webkit-user-select: none; }ul,li{list-style: none;}#outer{width: 4…

通达OA系统11.2漏洞

以通达OA系统11.2版本为案例的Web渗透 1. 渗透背景&#xff1a;2. 存在漏洞3. 漏洞复现3.1 前台任意用户登录漏洞3.1.1 漏洞原理&#xff1a;3.1.2 手工抓包复现&#xff1a;3.1.3 POC自动获取复现&#xff1a; 3.2 前台未授权访问漏洞3.3 管理后台文件上传漏洞3.4 后台SQL注入…

刷新本地的DNS缓存数据

ipconfig /flushdns”执行&#xff0c;刷新本地的DNS缓存数据。 ipconfig /displaydns 查看本地DNS缓存记录的命令为&#xff1a;ipconfig /displaydns。你将会看到包括本地Hosts文件记录和已访问过的站点在内的所有DNS记录。转载于:https://www.cnblogs.com/u0mo5/p/5010…

小白如何从零开始设计并开发一个微信小程序?

背景:微信小程序的出现,让更多的中小型企业初期不再以APP为首选,小程序的天然优势让他备受关注,也因此诞生了专门的小程序开发岗位,让前端有机会继续蚕食其他岗位的份额。 但微信小程序也会很多缺点,最大的就是监管太霸道,各种限制行业进入和权限,未开发的行业还是不能…

mvc2 mvc_每个人都知道MVC…

mvc2 mvc从一个最近的博客中&#xff0c;您可能会发现我最近一直在进行一些采访&#xff0c;就像他们对Web应用程序开发人员所说的那样&#xff0c;我问的一个问题是“您能解释一下MVC模式是什么吗&#xff1f;”&#xff0c;值得赞扬的是&#xff0c;每个候选人知道答案。 对于…

移动端 长按事件_Flutter事件监听

一. 事件监听 在大前端的开发中&#xff0c;必然存在各种各样和用户交互的情况&#xff1a;比如手指点击、手指滑动、双击、长按等等。在Flutter中&#xff0c;手势有两个不同的层次&#xff1a;第一层&#xff1a;原始指针事件(Pointer Events)&#xff1a;描述了屏幕上由触摸…

在CSDN的博文中如何添加博主名片

前言&#xff1a;以前看到很多大佬博文中都有自己的名片&#xff0c;我以为是他们自己打字打上去的&#xff0c;自己打上去样式却不理想。今天终于发现了新大陆。分享给你们。 效果图&#xff1a; 设置方法如图&#xff1a;找到创作权益——博主名片——展示博文详情页&#xf…

Ajax.BeginForm无法调用 ajaxOptions的js函数

使用ajax.beginForm无法调用ajaxOptions的js函数的原因&#xff0c;一般都是缺少以下2个JS文件&#xff1a; 1&#xff0c;Install-Package jQuery –version 1.10.22&#xff0c;Install-Package Microsoft.jQuery.Unobtrusive.Ajax –version 3.0.0 添加方法&#xff1a; 【工…

将非事务性资源绑定到JTA事务中的几种模式

我最近发表了一篇有关如何将非事务性资源&#xff08;如Web服务/微服务&#xff09;绑定到全局分布式事务中的文章&#xff0c;以便自动处理恢复。 多年来&#xff0c;我经常不得不将“非事务性”系统集成到Java EE应用程序服务器中&#xff0c;而数据一致性通常是讨论的话题&a…

vscode中文设置不生效_VSCode详细安装教程

1.下载https://code.visualstudio.com/download 是Microsoft&#xff08;微软的产品&#xff09;User Installer版&#xff1a;会安装在当前计算机帐户目录,意味着如果使用另一个帐号登陆计算机将无法使用别人安装的vscode。System Installer版&#xff1a;安装在非用户目录,例…

windows查看密码工具

windows查看密码工具windows前言 本篇介绍几款优秀的Windows上的密码抓取工具&#xff0c;每个工具都有自己的特点非常实用&#xff0c;欢迎补充。 0x01 Mimikatz 个人点评&#xff1a;这款工具非常强大&#xff0c;公认的Windows密码神器。 1. 简介 Mimikat是一个法国人写的轻…

孙叫兽VUE学习笔记总结(值得收藏),很全很详细!!!

官方文档:http://vuejs.org/v2/guide/syntax.html 中文文档: https://cn.vuejs.org/v2/guide/syntax.html Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。 Vue 的核心库只关注视图层,不…

hashCode之二--Java:重写equals()和hashCode()

以下内容总结自《Effective Java》。1.何时需要重写equals()当一个类有自己特有的“逻辑相等”概念&#xff08;不同于对象身份的概念&#xff09;。2.设计equals()[1]使用instanceof操作符检查“实参是否为正确的类型”。[2]对于类中的每一个“关键域”&#xff0c;检查实参中…

毛绒材质渲染_学室内设计必进,建模渲染那都不是事儿

近年来&#xff0c;室内设计从业人员需求量和薪酬持续增长带来的是室内设计行业的飞速发展&#xff0c;而设计能力也成为“创新与创造”的不可或缺。设计能力是多方面能力的综合体现而室内效果图作为设计成果的最主要表现手段&#xff0c;是最基础也是最重要的技能之一。那么持…

2020年末总结,脚踏实地,一步一个脚印——致敬自己一年的心酸历程

摘要:恰逢官方征文,谨以此篇记录自己一年的心酸历程与前端知识的感悟。 目录 在时代工场的主要工作 我为什么从时代工场离职?