避免延迟的JPA集合
但是,这有一个问题。 在我看来,异常是第二个最常见的异常(在NullPointerException之后),即LazyInitializationException。 问题在于会话通常为您的服务层打开,并且在您将实体返回到视图层后立即关闭。 当您尝试在视图中迭代未初始化的集合时(例如jsp),该集合将引发LazyInitializationException,因为它们所拥有的引用所在的会话已经关闭,并且无法获取这些项。
如何解决? 所谓的OpenSessionInView / OpenEntityManagerInView“模式”。 简而言之:您可以创建一个过滤器,以在请求启动时打开会话,并在呈现视图后(而不是在服务层完成后)关闭会话。 有人称其为反模式,因为它将持久性处理泄漏到视图层,并使设置复杂化。 我不会说那么糟糕:通常,它可以解决问题而不引入其他问题。 但是在我参与的所有最新项目中,我们没有使用OpenSessionInView,而且效果很好。
之所以能正常工作,是因为我们没有使用惰性集合。 但是,您会正确地指出,当您加载单个实体时,您将获取“整个世界”。 好吧,不。 * ToMany映射有两种类型:
- 值类型映射,集合在逻辑上不包含十几个元素。 在大多数情况下,这是@ElementCollection,还有@ * ToMany,它们带有诸如“ Category”或“ Price”之类的项,它们只是更复杂的值对象,但自身不包含任何其他映射。 这些类型的集合的另一个共同特征是它们通常与它们自己的实体一起显示在UI中。 例如,您最有可能要显示文章的类别。 对于这种类型的集合,EAGER是更好的选择。 无论如何,您都必须获取它们,为什么不让休眠(或任何jpa实现)想到一些巧妙的连接呢? 就像我说的那样-逻辑上集合不超过一打或十二个,因此获取它们不会对性能造成影响。 而且,从逻辑上讲,它们不会与它们一起获取大对象图。
- 大型核心实体之间的映射。 可以是“用户所下的所有订单”或“组织中的所有用户”,“供应商的所有项目”等。您当然不想急于获取它们。 因为如果您为一个组织获取2000个用户,那么每个组织又有1000个订单,而一个订单平均有3个项目,这反过来又包含所有购买该项目的人的集合。.您将最终拥有整个数据库在记忆中。 显然您需要惰性集合,对吗? 好吧,不。 在这种情况下,您根本不应该使用集合映射。 在99%的情况下,这些类型的关系显示在UI的页面列表中。 或在搜索结果中。 它们永远不会(也永远不会)全部显示在一个屏幕上(或者,如果您的应用程序提供了类似REST API之类的东西,则很少应该在一个API调用中返回它们)。 您必须对其进行查询,并使用query.setMaxResults和query.setFirstResult()(或使用一些限制性条件来限制它们)。 此外,对集合进行映射意味着有人会在某个时候尝试使用它们,这可能会失败。 并且如果对象已序列化(xml,json等),则将获取集合内容。 您几乎肯定不想发生的事情。 (这里的想法草案:JPA可以有一个PagedList集合,该集合将允许分页的延迟提取,从而消除了查询的需要)
所以我刚才说的是-永远不要使用惰性集合。 将eager集合用于非常简单的浅表映射,将分页查询用于较大的映射。
好吧,不完全是。 延迟集合在那里并且它们有应用,尽管它是相当有限的。 或者,至少它们比所使用的方法不太适用。 这是我发现适用的示例场景。 在我的附带项目中,我有一个Message实体,并且它包含一个Picture实体的集合。 用户上载图片时,它将存储在该集合中。 一条消息最多可以包含10张图片,因此非常希望收藏。 但是,然后,Message是最常用的实体–实际上是在每个请求中获取的。 但是只有一些消息带有图片(您的信息流中有多少条推文有图片上传?)。 因此,我不想让休眠状态进行查询只是为了查找给定消息没有图片。 因此,我将图片数量存储在一个单独的字段中,使图片集合变得懒惰,并且仅在图片数量> 0时才手动对其进行Hibernate.initialize(..)。
因此,在某些情况下,当实体具有属于上述第一类的可选集合时(“小型浅表集合”)。 因此,如果它很小,很浅并且是可选的(例如,在不到20%的情况下使用),则应该使用Lazy来保存不必要的查询。
其他方面–懒惰的收藏会让您的生活更艰难。
参考:在Bozho的技术博客上, 避免与我们的JCG合作伙伴 Bozho一起使用懒惰的JPA Collections 。
相关文章 :
- 休眠陷阱
- DataNucleus 3.0与Hibernate 3.5
- Hibernate映射集合性能问题
- ORM问题
- 框架使开发人员愚蠢吗?
- 每个程序员都应该知道的事情
- Java最佳实践
翻译自: https://www.javacodegeeks.com/2011/10/avoid-lazy-jpa-collections.html
避免延迟的JPA集合相关推荐
- jpa 查询集合_避免懒惰的JPA集合
jpa 查询集合 Hibernate(实际上是JPA)具有集合映射:@ OneToMany,@ ManyToMany,@ ElementCollection. 默认情况下,所有这些都是惰性的. 这意味 ...
- java 集合 延迟加载_java-如何测试延迟加载的JPA集合是否已初始化?
您正在使用JPA2吗? PersistenceUnitUtil具有两种可用于确定实体的加载状态的方法. 例如 组织和用户之间存在双向的OneToMany / ManyToOne关系. public v ...
- 扩展您的JPA POJO
可扩展性是许多体系结构的重要特征. 它衡量是否容易(或困难) 它是在不影响现有核心系统功能的情况下添加或更改功能. 让我们举一个简单的例子. 假设您的公司拥有一个核心产品来跟踪体育俱乐部中的所有用户. ...
- jpa动态扩展sql_扩展您的JPA POJO
jpa动态扩展sql 可扩展性是许多体系结构的重要特征. 它衡量是否容易(或困难) 它是在不影响现有核心系统功能的情况下添加或更改功能. 让我们举一个简单的例子. 假设您的公司拥有一个核心产品来跟踪体 ...
- .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页、延迟执行和日志记录
步步为营VS 2008 + .NET 3.5(11) - DLINQ(LINQ to SQL)之大数据量分页.延迟执行和日志记录 作者:webabcd 介绍 以Northwind为示例数据库,DLIN ...
- jpa 定义中间表实体_JPA系列之-带你快速掌握JPA
课程目录: 课程目标:理解JPA规范,JPA提供商,JPA的优势,JPA的具体开发应用.JPA是SUN公司定义的持久化API,相当于JDBC的角色,以统一的接口访问数据库,通过本课程的学习,让大家快速 ...
- JPA 概述及 SpringDataJpa 框架基本使用指南
概述 JPA 介绍 JPA 官方文档:传送门 JPA(Java Persistence API)是 Java 标准中的一套 ORM 规范(提供了一些编程的 API 接口,具体实现由 ORM 厂商实现, ...
- 音视频直播如何实现低延迟
大家在日常生活中接触到各类直播,例如游戏直播.乐秀.在线教育.发布会等等.无论哪种类型的直播,延时是直播过程中需要关注的一个重要的点. 直播实现低延迟,是对大部分直播产品的要求,低延迟也是提升直播产品 ...
- 支持8K播放且低延时高并发全功能的流媒体播放器如何降低直播延迟?
背景 直播行业大火,大家可以在日常生活中接触到各类直播,例如游戏直播.乐秀.在线教育.发布会等.无论哪种类型的直播,延时是直播过程中需要关注的重要方面.直播实现低延迟,是对大部分直播产品的要求,低延迟 ...
最新文章
- 关于Map的key值的问题
- FileInputStream 之read(byte [] b)方法
- jenkins pipeline python_Jenkins Pipeline示例
- java语句中switch_Java中的switch-case语句
- 对A1A2A10B1B2N12排序
- java this() super(),Java super()和this()的区别用法及代码示例
- 最强代码生成器平台,杀疯了~
- vlan internal allocation policy ascending解释
- 论文阅读《High-Definition Map Generation Technologies For Autonomous Driving: A Review》2
- 入门SAP MM的学习流程
- Shader 蔓藤生长动画
- SIP(会话发起协议)
- png mat 转 osg
- 一位AI大佬给算法校招同学的建议:观点篇
- 狂神说springboot课堂笔记
- android之文件上传
- 67.220.90.12/bbs/index.php,对乌云漏洞库的分析.md
- 帝国论坛又开放了,帝国爱好者们可以愉快的逛论坛查资源了
- 机器人控制——PID参数整定
- VB中关于while...wend的使用
热门文章
- selenium自动化测试_维持Selenium测试自动化的完美方法
- java char类型空值_展望Java的未来:空值类型
- 为什么SpringBoot如此受欢迎?如何有效地学习SpringBoot?
- stringbuffer_StringBuffer的存在的含义
- java redis 命令_命令界面:使用Java中的动态API处理Redis
- javaio流层次结构_流的多层次分组
- javaone_JavaOne 2015 –又一年,又向前迈进了一步
- 高性能 高可用 可弹性伸缩_性能,可伸缩性和活力
- Java:使用Toxiproxy模拟各种连接问题
- Java,JavaFX的流畅设计风格滑块