本文从教程​​的第1部分继续。

使用PersistenceContextType.EXTENDED的有状态EJB加载收集

该方法只能应用于与Full JEE环境兼容的应用程序:将EJB与PersistenceContextType.EXTENDED一起使用。

检查下面的代码,DAO的样子:

package com.ejb;import javax.ejb.Stateful;
import javax.persistence.*;import com.model.Person;@Stateful
public class SystemDAOStateful {@PersistenceContext(unitName = 'LazyPU', type=PersistenceContextType.EXTENDED)private EntityManager entityManager;public Person findByName(String name) {Query query = entityManager.createQuery('select p from Person p where name = :name');query.setParameter('name', name);Person result = null;try {result = (Person) query.getSingleResult();} catch (NoResultException e) {// no result found}return result;}
}
public class DataMB {// other methods and attributes@EJBprivate SystemDAOStateful daoStateful;public Person getPersonByStatefulEJB() {return daoStateful.findByName('Mark M.');}
}
<h:dataTable var='dog' value='#{dataMB.personByStatefulEJB.lazyDogs}'><h:column><f:facet name='header'>Dog name</f:facet>#{dog.name}</h:column>
</h:dataTable>

这种方法的优点和缺点:

优点

缺点

容器将控制数据库事务

仅适用于JEE

模型类别将不需要编辑

可能会发生N + 1效应

大量的有状态EJB可能会影响容器内存。

这种方法可能会产生N + 1效果,并且有状态EJB的特征是在其会话未到期或丢失参考之前不会被删除/销毁。

警告 :在保留在Pool中的对象中保留对注入的EJB的引用不是一个好习惯。 JSF将创建一个ManagedBean池以更好地处理用户请求。 必要时,容器将增加或减少池中ManagedBean的数量。 在本文的代码中,假设如果容器在池中创建100个ManagedBeans实例,则服务器将在内存中容纳100个有状态EJB。 解决该问题的方法是对有状态EJB进行JNDI查找。

通过联接查询加载集合

该解决方案易于理解和应用。

请参见下面的代码:

public Person findByNameWithJoinFech(String name) {Query query = entityManager.createQuery('select p from Person p join fetch p.lazyDogs where p.name = :name');query.setParameter('name', name);Person result = null;try {result = (Person) query.getSingleResult();} catch (NoResultException e) {// no result found}return result;}
public Person getPersonByQuery() {return systemDAO.findByNameWithJoinFech('Mark M.');}
<h:dataTable var='dog' value='#{dataMB.personByQuery.lazyDogs}'><h:column><f:facet name='header'>Dog name</f:facet>#{dog.name}</h:column></h:dataTable>

这种方法的优点和缺点:

优点

缺点

数据库中只会触发一个查询

每个访问的集合/惰性属性都需要一个查询

模型类别将不需要编辑

将只带来所需的数据

N + 1效果不会发生

这种方法的缺点是需要新的查询来访问每个模型类集合/惰性属性。 如果只需要查询“ Person”狗,则需要特定查询。 假设我们需要查询“个人”电子邮件,则有必要进行其他查询。

这种方法可以应用于JSE和JEE。

EclipseLink和惰性集合初始化

关系的默认值为:

关系

@OneToOne

急于

@OneToMany

@多多

急于

@多多多

但是JPA Spec *指出:

EAGER策略是对持久性提供程序运行时的要求,必须热切地获取数据。 LAZY策略向持久性提供程序运行时提供了提示,即首次访问数据时应延迟获取数据。 该实现允许急切地获取已为其指定LAZY策略提示的数据 特别是,懒惰获取可能仅适用于使用基于属性的访问的基本映射。

如您在上面的文本中看到的那样,JPA实现可能会忽略提示策略。 EclipseLink具有JEE行为和JSE其他行为。 您可以在此处查看每种行为: http : //wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#What_You_May_Need_to_Know_About_EclipseLink_JPA_Lazy_Loading

我们可以在互联网上找到一些人说,即使是惰性集合,EclipseLink也会在加载实体时执行n + 1查询。 我们可以找到使用Glassfish和EJB的用户的这种行为。

在下面,您将看到一些在EclipseLink上正确使用延迟加载的提示:

  • http://stackoverflow.com/questions/8490532/eclipselink-lazy-loading
  • http://stackoverflow.com/questions/3932623/eclipselink-dont-fetch-some-fields-by-default
  • https://forums.oracle.com/forums/thread.jspa?messageID=1706796

* JSR-000220企业JavaBeans 3.0最终版本(持久性)9.1.18,并将重复与水獭JPA的关系。

结束!

我认为最好的解决方案是联接获取查询。 您可以根据自己的应用选择最佳解决方案

单击此处下载此帖子的源代码 。 如果要运行本文的代码,则需要创建一个名为LazyExceptionDB的数据库和JBoss模块。 附加到源代码的是Postgres模块。 如果您想了解如何设置数据源以及Postgres或MySQL模块,则可以在这里查看: 完整的WebApplication JSF EJB JPA JAAS 。

希望这篇文章对您有所帮助。

如果您有任何意见或疑问,请发表。

再见。

参考: uaiHebert博客上的JCG合作伙伴 Hebert Coelho 对LazyInitializationException的四个解决方案 。

翻译自: https://www.javacodegeeks.com/2012/07/four-solutions-to-lazyinitializationexc.html

LazyInitializationException的四种解决方案–第2部分相关推荐

  1. LazyInitializationException的四种解决方案–第1部分

    在今天的帖子中,我们将讨论常见的LazyInitializationException错误. 我们将看到四种避免该错误的方法,以及每种方法的优缺点.在本文的最后,我们将讨论EclipseLink如何处 ...

  2. LazyInitializationException的四个解决方案–第2部分

    本文从本教程的第1部分继续. 有状态EJB使用PersistenceContextType.EXTENDED进行负载收集 该方法只能应用于与Full JEE环境兼容的应用程序:将EJB与Persist ...

  3. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)

    2017-07-08 remember17 Cocoa开发者社区 目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 ...

  4. Android软键盘遮挡的四种解决方案

    Android软键盘遮挡的四种解决方案 参考文章: (1)Android软键盘遮挡的四种解决方案 (2)https://www.cnblogs.com/jerehedu/p/4194125.html ...

  5. 面试必备:缓存穿透,缓存雪崩的四种解决方案

    前言 设计一个缓存系统,不得不考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数 ...

  6. beyond compare4过期解决方法_面试必备:缓存穿透、雪崩解决方案及缓存击穿的四种解决方案...

    前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到 ...

  7. 详解MySQL双活同步复制四种解决方案

    详解MySQL双活同步复制四种解决方案 参考文章: (1)详解MySQL双活同步复制四种解决方案 (2)https://www.cnblogs.com/wuchangsoft/p/10390552.h ...

  8. win10远程计算机证书错误,win10系统下出现Wi-Fi证书错误的四种解决方案

    wifi想必大家都很熟悉吧,这是很多用户们喜欢的无线网络,但是在使用过程中也常常会遇到问题,比如近日就有不少win10系统的用户反馈说在连接wifi的时候,出现了wifi证书错误的情况,导致无法连接到 ...

  9. 计算机突然无法连接网络,win7电脑突然不能上网的四种解决方案

    现如今网络已经非常普及了,基本上家家户户都实现电脑上网了,在深度技术Win7系统上网的时候会遇到电脑突然不能上网的问题,有什么办法能够解决不能上网问题呢?电脑突然不能上网一般都是我们更改了电脑的设置后 ...

最新文章

  1. latex中的引用命令\citep{}和\citet{}
  2. Python程序设计题解【蓝桥杯官网题库】 DAY6-基础练习
  3. IT人的十八般武艺-序言
  4. ACE前摄器Proactor模式
  5. Putty基础教程之(一).入门命令学习及编写HTML
  6. java中的深度克隆浅克隆_了解Java中的可克隆接口
  7. javascript中 __proto__与prorotype的理解
  8. 稳定币协议Fei Protocol通过FIP-2提案
  9. line java_java – Line Rasterization / 4-bresenham
  10. JavaScript进制之间的转换
  11. 从Exchange 通往Office 365系列(五)部署MailBox服务器
  12. cmd cd命令_Windows系统CMD命令提示符的常用命令汇总
  13. 好用家庭收支管理 1.0.20130204绿色免费版
  14. 手机刷入面具_小米手机机型怎么刷入脸谱Magisk模块详细教程
  15. Python 一维数据
  16. python-函数的递归
  17. Android中的Menu功能菜单-OptionsMenu[选项菜单]
  18. 速写,没有前因后果,没有背景交待……
  19. 十分钟带你了解Vue框架
  20. Phpcms重新安装

热门文章

  1. XML——解析XML文档
  2. aws lambda_AWS Lambda事件源映射:使您的触发器混乱无序
  3. apache pulsar_Apache Pulsar:分布式Pub-Sub消息系统
  4. kata_小规模流处理kata。 第2部分:RxJava 1.x / 2.x
  5. java jinq_将JINQ与JPA和H2一起使用
  6. java持久性与安全性_Java持久性锁定初学者指南
  7. Java单依赖性Dockerized HTTP端点
  8. 使用AWS Lambda在Go中构建RESTful API
  9. Java 9中的无限集
  10. 如何使用Spring初始化程序创建Spring Boot项目