延迟初始化错误(ERROR LazyInitializer)是如何产生的

.NET 4.0 Lazy<T> 延迟初始化原理与高可用实践 Lazy<T> 是 .NET 基础类库中用于实现线程安全、单例式同步延迟初始化的核心类型,其本质是将对象创建时机从声明/构造阶段解耦至首次访问时刻。它基于内存屏障(MemoryBarrier)和原子操作(Interlocked)保障初始化过程的顺序性与可见性,彻底规避手写双重检查锁(DCL)因编译器重排序导致的‘半成品对象’风险。技术价值在于显著降低冷启动耗时、减少内存驻留、提升资源管控粒度,广泛适用于 Web API 初始化、WPF 窗体加载及后台服务等对首请求响应敏感的场景。本文深入剖析 .NET 4. 阅读详情

       延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。如果在游离状态时才初始化它,就会产生延迟初始化错误。

下面把Customer.hbm.xml文件的<class>元素的lazy属性设为true,表示使用延迟检索策略:

< class  name ="mypack.Customer"  table ="CUSTOMERS"  lazy ="true" >

当执行Session的load()方法时,Hibernate不会立即执行查询CUSTOMERS表的select语句,仅仅返回Customer类的代理类的实例,这个代理类具由以下特征:

(1) 由Hibernate在运行时动态生成,它扩展了Customer类,因此它继承了Customer类的所有属性和方法,但它的实现对于应用程序是透明的。
(2) 当Hibernate创建Customer代理类实例时,仅仅初始化了它的OID属性,其他属性都为null,因此这个代理类实例占用的内存很少。
(3) 当应用程序第一次访问Customer代理类实例时(例如调用customer.getXXX()或customer.setXXX()方法),Hibernate会初始化代理类实例,在初始化过程中执行select语句,真正从数据库中加载Customer对象的所有数据。但有个例外,那就是当应用程序访问Customer代理类实例的getId()方法时,Hibernate不会初始化代理类实例,因为在创建代理类实例时OID就存在了,不必到数据库中去查询。

提示:Hibernate采用CGLIB工具来生成持久化类的代理类。CGLIB是一个功能强大的Java字节码生成工具,它能够在程序运行时动态生成扩展Java类或者实现Java接口的代理类。关于CGLIB的更多知识,请参考:http://cglib.sourceforge.net/。

以下代码先通过Session的load()方法加载Customer对象,然后访问它的name属性:

tx  =  session.beginTransaction();
Customer customer
= (Customer)session.load(Customer. class , new  Long( 1 ));
customer.getName();
tx.commit();

在运行session.load()方法时Hibernate不执行任何select语句,仅仅返回Customer类的代理类的实例,它的OID为1,这是由load()方法的第二个参数指定的。当应用程序调用customer.getName()方法时,Hibernate会初始化Customer代理类实例,从数据库中加载Customer对象的数据,执行以下select语句:

select   *   from  CUSTOMERS  where  ID = 1 ;
select   *   from  ORDERS  where  CUSTOMER_ID = 1 ;

当<class>元素的lazy属性为true,会影响Session的load()方法的各种运行时行为,下面举例说明。

1.如果加载的Customer对象在数据库中不存在,Session的load()方法不会抛出异常,只有当运行customer.getName()方法时才会抛出以下异常:

ERROR LazyInitializer: 63   -  Exception initializing proxy
net.sf.hibernate.ObjectNotFoundException: No row with the given identifier exists: 
1 , of  class : 
mypack.Customer

 2.如果在整个Session范围内,应用程序没有访问过Customer对象,那么Customer代理类的实例一直不会被初始化,Hibernate不会执行任何select语句。以下代码试图在关闭Session后访问Customer游离对象:

tx  =  session.beginTransaction();
Customer customer
= (Customer)session.load(Customer. class , new  Long( 1 ));
tx.commit();
session.close();
customer.getName();

由于引用变量customer引用的Customer代理类的实例在Session范围内始终没有被初始化,因此在执行customer.getName()方法时,Hibernate会抛出以下异常:

ERROR LazyInitializer: 63   -  Exception initializing proxy
net.sf.hibernate.HibernateException: Could not initialize proxy 
-  the owning Session was closed

由此可见,Customer代理类的实例只有在当前Session范围内才能被初始化。

3.net.sf.hibernate.Hibernate类的initialize()静态方法用于在Session范围内显式初始化代理类实例,isInitialized()方法用于判断代理类实例是否已经被初始化。例如:

tx  =  session.beginTransaction();
Customer customer
= (Customer)session.load(Customer. class , new  Long( 1 ));
if ( ! Hibernate.isInitialized(customer)) 
Hibernate.initialize(customer);
tx.commit();
session.close();
customer.getName();

以上代码在Session范围内通过Hibernate类的initialize()方法显式初始化了Customer代理类实例,因此当Session关闭后,可以正常访问Customer游离对象。

4.当应用程序访问代理类实例的getId()方法时,不会触发Hibernate初始化代理类实例的行为,例如:

tx  =  session.beginTransaction();
Customer customer
= (Customer)session.load(Customer. class , new  Long( 1 ));
customer.getId();
tx.commit();
session.close();
customer.getName();

当应用程序访问customer.getId()方法时,该方法直接返回Customer代理类实例的OID值,无需查询数据库。由于引用变量customer始终引用的是没有被初始化的Customer代理类实例,因此当Session关闭后再执行customer.getName()方法,Hibernate会抛出以下异常:

ERROR LazyInitializer: 63   -  Exception initializing proxy
net.sf.hibernate.HibernateException: Could not initialize proxy 
-  the owning Session was closed

原文出处: http://www.javathinker.org/main.jsp?bc=hibernate/hibernate_essay_16.htm  选自<<精通Hibernate:Java对象持久化技术详解>>  作者:孙卫琴

 
避坑指南:海康MV_CC_SetIntValue接口的7个典型报错解决方案 本文深度解析海康工业相机SDK中MV_CC_SetIntValue接口的典型报错,提供7个实战解决方案。针对MV_E_CALLORDER、MV_E_PARAMETER等高频错误码,从设备状态、参数值域、依赖关系等核心约束入手,给出清晰的诊断流程与根治代码,帮助开发者构建健壮的参数设置模块,提升开发效率。 阅读详情

相关推荐

Kriging代理模型理论相关推导

代理模型,Kriging,加点准则

森屹的博客 1万+

【C#】并行编程实战:使用延迟初始化提高性能

在前面的章节中讨论了 C# 中线程安全并发集合,有助于提高代码性能、降低同步开销。本章将讨论更多有助于提高性能的概念,包括使用自定义实现的内置构造。 本章主要内容为通过延迟初始化提高性能,相对比较简单。

魔术师Dix的博客 951

从零到一:YT8512C PHY芯片在STM32F407上的LWIP移植实战与避坑指南

本文详细介绍了YT8512C PHY芯片在STM32F407平台上基于LWIP协议栈的移植实战,涵盖硬件连接、CubeMX配置、寄存器定制和调试技巧。重点解析了与主流PHY芯片的差异,提供了完整的避坑指南和优化建议,帮助开发者快速实现稳定可靠的嵌入式网络连接。

uber9的博客 538

基础才是重中之重~LazyInitializer.EnsureInitialized对属性实现化的性能优化

回到目录 LazyInitializer.EnsureInitialized是frameworks4.0引入的新东西,实现对属性延时初始化的功能,它作用在System.Threading命名空间下,所以,它与多线程有着密切的关系,即当多人同步使用这个方法时,对存储的对象有着某种作用,这是msdn的相关说明: 这个方法可以用于多个执行者初始化Target目录对象。 在多个执行者同时存取这个...

weixin_33894640的博客 168

解决 Clawdbot 对接 Minimax 出现 401 (Token is unusable) 的问题排查与修复

即便确认 API Key 有效且余额充足,该问题仍可能在 Clawdbot 中持续出现,而在其他工具(如 curl 或 Postman)中测试正常。

hampeter的博客 3072

Unity抖音小游戏上架实战:从零到一,详解流程与避坑指南

本文详细介绍了Unity抖音小游戏上架的全流程,包括环境准备、SDK集成、开发者账号注册、软著申请、打包提交流程及常见问题解决方案。重点解析了抖音小游戏平台特有的配置细节和避坑技巧,帮助开发者高效完成游戏上架并优化用户体验。

weixin_33704234的博客 260

LazyInstance

chromium 延迟加载实例

飞鸟的专栏 1228

PyTorch生成式人工智能(25)——基于Transformer实现机器翻译

不同于循环神经网络 (RNN) 按顺序处理数据,Transformer 以并行的方式处理输入数据(例如句子)。这种并行处理提高了效率,但并未使其能够识别输入的顺序。为了解决这个问题,Transformer 向输入的词嵌入中添加了位置编码。这些位置编码是分配给输入序列中每个位置的独特向量,其维度与输入词嵌入对齐。本节将以英语到法语的翻译为例,通过介绍如何训练 Transformer 模型将英语句子转换为法语,深入理解 Transformer 的架构及自注意力机制的运作方式。

盼小辉丶的博客 2700

Hyperledger Fabric问题汇总

hyperledger fabric问题汇总

解鞍少驻初程的博客 3439

2025国赛数学建模A题 完整Python代码 烟幕干扰弹的投放策略

常量定义G = 9.8 # 重力加速度 m/s²V_SMOKE_SINK = 3 # 烟幕下沉速度 m/sMISSILE_SPEED = 300 # 导弹速度 m/sEFFECTIVE_RADIUS = 10 # 有效遮蔽半径 mEFFECTIVE_DURATION = 20 # 有效遮蔽时间 sTARGET_POS = np.array([0, 200, 0]) # 目标位置FALSE_TARGET_POS = np.array([0, 0, 0]) # 假目标位置# 初始位置。

YOLO 1105

Docker 环境 Playwright MCP 部署全流程指南

Docker部署Playwright MCP全流程指南 本文详细介绍了使用Docker容器化部署Playwright MCP的完整流程,涵盖镜像拉取、容器启动、配置优化和问题排查。主要内容包括: 核心部署步骤:通过官方镜像快速搭建环境,支持自定义端口和数据持久化 关键配置要点:详解网络设置、持久化目录挂载和环境变量配置 服务验证方法:通过日志检查和服务连通性测试确保部署成功 客户端集成:提供VS Code等IDE的配置示例 常见问题解决:针对浏览器启动超时、跨域限制等问题给出解决方案 实战案例:演示自动化爬

勤奋的码农 1473

延迟初始化错误(ERROR LazyInitializer)是如何产生的?

选自> 作者:孙卫琴 来源:www.javathinker.org如果转载,请标明出处,谢谢延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。如果在游离状态时才初始化它,就会产生延迟初始化错误。下面把Customer

wangfeng8720的专栏 384

LVGL嵌入式GUI工程化架构与多窗口实践

嵌入式GUI开发中,LVGL作为轻量级图形库,其核心价值在于高效渲染与事件驱动机制。理解LVGL的对象树模型、资源管理机制(如RAW图像、静态字体)和屏幕生命周期,是构建稳定界面的基础。结合FreeRTOS等实时操作系统,可实现低功耗、高响应的交互体验。典型应用场景包括智能电表、HMI人机界面、工业控制面板等对内存敏感、需长期运行的设备。本文以微信式多窗口架构为范例,深入解析LVGL工程化落地的关键路径:分层目录结构、窗口模块封装、状态机式登录逻辑、TabView多页导航及图表/仪表盘动态可视化,覆盖从资源

weixin_36001279的博客 87

收藏:延迟初始化错误(ERROR LazyInitializer)是如何产生的?

选自 作者:孙卫琴 来源:www.javathinker.org 如果转载,请标明出处,谢谢 延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。如果在游离状态时才初始化它,就会产生延迟初始化错误。 下面把Customer.hbm.xml...

解决问题收藏 164

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

延迟初始化错误(ERROR LazyInitializer)

网上有用的相关资料: 一个困扰了我好几天的Hibernate+Spring的问题,算是解决了吧! 延迟初始化错误(ERROR LazyInitializer)是如何产生的?    

rongjunXue 226

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C#的Lazy与LazyInitializer

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 //初始化 Lazy 类的新实例 6 //当延迟初始化发生时,将使用指定的初始化函数和初始化模式 7 // 参数: 8 ...

weixin_30800987的博客 232

fabric-go-sdk使用中的若干问题

fabric-go-sdk使用中的若干问题–连接e2e网络 problem localhost:heroes-service liu$ go run main.go SDK created Ressource management client created Channel created Channel joined Initialization Successful ccPkg cre...

longtails的博客 4329

hibernate JPA 使用懒加载时代理产生的问题 JavassistLazyInitializer

引用来自: http://stackoverflow.com/questions/16383742/hibernate-javassistlazyinitializer-problems-with-validation 问题描述: 当两个对象相互关联并使用懒加载时,从数据库中取出来使用时报错,查看对象所有字段的值为null;但通过get\setXXX()有能得到该对象的字段值。 ...

xurk0922的博客 1457

连接到多机生产网络调用合约报错Discovery status Code: (11) UNKNOWN. Description: error getting endorsers: no endorse

fabric-sdk-go调用合约报错 Failed to evaluate transaction: Failed to evaluate: Failed to get endorsing peers: Discovery status Code: (11) UNKNOWN. Description: error getting endorsers: no endorsement combination can be satisfied。解决方案使用gatewayapi

关关的博客 881

ssh项目报org.hibernate.proxy.pojo.BasicLazyInitializer错误的解决方法

ERROR [org.hibernate.proxy.pojo.BasicLazyInitializer]-Javassist Enhancement failed: com.chuangworld.system.company.model.CompanyTable。 2016-03-08 17:46:37 WARN [org.hibernate.tuple.entity.PojoEntityTu

小田田的专栏 1649

JAVA——json序列化错误["hibernateLazyInitializer","handler","fieldHandler"]解决方案

问题描述 com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl and ...

无限迭代中...... 4493

Could not initialize proxy - the owning Session was closed

其实这个异常写的非常之清楚,就是会话关闭,无法对Hibernate实体进行操作。造成这样的情况有很多,什么书写错误啊,逻辑错误啊。但就此说一下关于lazy机制:延迟初始化错误是运用Hibernate开发项目时最常见的错误。如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。如果在游离状态时才初始化它,就会产生延

HouYing 1745

java 延迟初始化_java-不正确的延迟初始化

java-不正确的延迟初始化Findbug告诉我,我使用了不正确的延迟初始化。public static Object getInstance() {if (instance != null) {return instance;}instance = new Object();return instance;}我在这里没有发现任何问题。 findbug的行为是否错误,还是我错过了一些事情?8个解决...

weixin_35843830的博客 1012

PAT_A 1113. Integer Set Partition (25)

1113. Integer Set Partition (25)

longtails的博客 587
上一篇: Eclipse插件问题
下一篇: 一个速度超快的日期选择JS
chenzhang8
博客等级 码龄24年 8粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值