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

本文从教程​​的第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

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

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

相关文章

Linux将硬盘转化为pv,Linux扩展硬盘 物理卷(PV) 卷组(VG) 逻辑卷(LV)

1、给虚拟机添加两块新的sata虚拟硬盘&#xff0c;容量8G和10G# fdisk -l 命令2、分别在这两个硬盘上建立pvPvcreate /dev/sdb 创建一个物理卷/dev/sdb 磁盘名是 fdisk -l 查询出来的Pvscan 查看当前所有物理卷Pvdisplay 查看当前所有物理卷的详情3、创建VG&#xff0c;使得…

ubuntu 16.10 shu rufa meiy ou l e geng xi zhi hou

转载于:https://www.cnblogs.com/ganmk--jy/p/6035894.html

ZOJ Monthly, November 2012

A.ZOJ 3666 Alice and Bob 组合博弈&#xff0c;SG函数应用#include<vector> #include<cstdio> #include<cstring> #include<algorithm>using namespace std;const int maxn 10000 100; int SG[maxn]; vector<int> g[maxn];int mex(int u) { /…

使用Aspect和Spring Profile进行电子邮件过滤

在Web应用程序开发期间&#xff0c;经常需要发送电子邮件。 但是&#xff0c;有时数据库中会包含来自生产的数据&#xff0c;并且存在在电子邮件测试执行期间向真实客户发送电子邮件的风险。 这篇文章将解释如何避免在没有在发送电子邮件功能中明确编写代码的情况下避免这种情…

红旗linux 进不去图形界面,进不了红旗Linux6.0的图形界面请高手帮忙

习生 于 2008-11-02 11:08:42发表:引用:原帖由 zhaoruiqi 于 2008-11-2 10:03 发表 我的也是进不了图形界面&#xff0c;用文本安装后进系统也一样正常按rtl的方法对xorg.conf进行修改,已经能进入图形界面。你看看楼上rtl的回复的能否对你有帮助。zhaoruiqi 于 2008-11-02 10:0…

总结继承的几种方式

简单总结继承的几种方式 JavaScript作为一门弱类型的语言&#xff0c;本着精简的原则&#xff0c;它取消了类的概念&#xff0c;只有对象的概念&#xff0c; 更是有万物皆对象的说法。在基于类的面向对象方式中&#xff0c;对象&#xff08;object&#xff09;依靠类&#xff0…

Oracle SQL精妙SQL语句讲解(二)

- 如果存在就更新&#xff0c;不存在就插入用一个语句实现 DROP TABLE t_mg; CREATE TABLE t_mg(code VARCHAR2(10), NAME VARCHAR2(10)); SELECT * FROM t_mg; MERGE INTO t_mg a USING (SELECT the code code, the name NAME FROM dual) b ON (a.code b.code) WHEN M…

Spring Security –在一个应用程序中有两个安全领域

这篇博客文章主要是关于Spring Security配置的。 更具体地说&#xff0c;它打算显示如何在一个Web应用程序中配置两个不同的安全领域。 第一安全领域是针对浏览器客户端的。 它使我们能够在登录页面中登录并访问受保护的资源。 第二安全领域旨在处理来自android应用程序的REST…

基于Activiti工作流引擎实现的请假审核流程

概要 本文档介绍的是某商用中集成的Activiti工作流的部署及使用&#xff0c;该框架用的Activiti版本为5.19.0。本文档中主要以一个请假流程为例子进行说明&#xff0c;该例子的流程图如下&#xff1a; 这是一个可以正常运作的工作流业务了&#xff0c;但是它也有不足的地方&…

linux编译ffmpeg成so,「ffmpeg」一 mac 环境下编译ffmpeg,生成so库文件

1.下载ffmpeg源码,官网&#xff0c;我这里直接采用git 方式下载&#xff1a;下载ffmpeg.png终端输入git命令&#xff1a;静静等待~最后下载的版本为3.4.6 。image.png这里注意一下&#xff0c;刚开始我用的ndk版本是ndk-17b&#xff0c;在编译该版本的ffmpeg时始终失败&#xf…

4Web Service中的几个重要术语

4.1WSDL: web service definition language 直译:Webservice定义语言 1.对应一种类型的文件.wsdl 2.定义了webservice的服务端与客户端应用交互传递请求和响应数据的格式和方式 3.一个webservice对应一个唯一的esdl文档 4.2SOAP: simple object access protocal 直译:简单对象访…

云端:亚马逊,谷歌应用引擎,Windows Azure,Heroku,Jelastic

您想在云端吗&#xff1f; 您有很多选择。 我已经评估或使用了许多方法&#xff0c;因此这里有几句话。 &#xff08;当我使用Java时&#xff0c;我将包括一些与Java相关的注释&#xff0c;但大多数情况适用于所有&#xff08;受支持的&#xff09;语言。&#xff09; 但是在深…

JS-字符串操作-替换

<!DOCTYPE HTML><html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>无标题文档</title><style>p { border:10px solid #ccc; background:#FFC; width:400px; padding:20px;…

linux下kegg注释软件,KEGG数据中全部代谢反应和代谢物注释信息的下载

# 加载函数与R包 -----------------------------------------------------------------library(KEGGREST)library(plyr)source("./RbioRXN-master/RbioRXN-master/R/get.kegg.all.R")source("./RbioRXN-master/RbioRXN-master/R/get.kegg.byId.R")## KEGG数…

java常见异常

算术异常类&#xff1a;ArithmeticExecption空指针异常类&#xff1a;NullPointerException 类型强制转换异常&#xff1a;ClassCastException 数组负下标异常&#xff1a;NegativeArrayException 数组下标越界异常&#xff1a;ArrayIndexOutOfBoundsException 违背安全原则异常…

Spring Security 3 Ajax登录–访问受保护的资源

我看过一些有关Spring Security 3 Ajax登录的博客&#xff0c;但是我找不到解决如何调用基于Ajax的登录的博客&#xff0c;匿名用户正在Ajax中访问受保护的资源。 问题 – Web应用程序允许匿名访问某些部分&#xff0c;并且某些部分是受保护的资源&#xff0c;需要用户登录。 …

测试环境下将centos6.8升级到centos7的操作记录(转)

在测试环境下安装openstack&#xff0c;由于在centos6下安装openstack&#xff0c;针对源的问题有很多&#xff0c;安装起来很不顺利&#xff01; 但是在centos7下安装却很顺利&#xff0c;所以考虑将服务器由centos6升级到centos7 这个我是在测试机中运行的&#xff0c;建议不…

linux运维选择题,初学Linux练习题

1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中tr ‘a-z’ ‘A-Z’ < /etc/issue > /tmp/issue.out2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中3、一个linux用户给root发邮件&#xff0c;要求邮件标题为”help”&#xff0c…

[转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务

本文转自&#xff1a;http://www.cnblogs.com/fzrain/p/3923727.html 前言 很久没更新了&#xff0c;之前有很多事情&#xff0c;所以拖了很久&#xff0c;非常抱歉。好了&#xff0c;废话不多说&#xff0c;下面开始正题。本篇仍然使用上一季的的项目背景&#xff08;系列地址…

使用Spring 3 MVC处理表单

本文是有关Spring 3的一系列文章的一部分。该系列的上一篇文章可以在此处获得 。 在本文中&#xff0c;我们向Spring MVC迈出了又一步。 [此外&#xff1a; 术语MVC的创建者提供的pdf 。]从上一篇文章构建&#xff0c;让我们添加将“联系人”添加到应用程序所需的代码。 首先&a…