延迟初始化错误是运用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
分享到:
相关推荐
除了以上实现,还有其他一些变种,例如使用`Lazy<T>`类型或`System.LazyInitializer`类进行懒初始化,或者使用`ConcurrentDictionary`来保证线程安全。每种实现方式都有其优缺点,开发者应根据具体的应用场景和性能...
新增了自动属性、属性和Visual Studio调试器、对象和集合初始化器、匿名类型、System.Tuple类型和ExpandoObject类型的讨论。 Chapter 11-Events Added discussion of events and thread-safety as well as showing...
最常用的有两个:Java内置的`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`,以及Apache Commons Lang的`org.apache.commons.lang3.concurrent.LazyInitializer`。然而,这些方案并不适用于...
1、文件内容:spice-glib-devel-0.35-5.el7_9.1.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/spice-glib-devel-0.35-5.el7_9.1.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
perl516-perl-Locale-Maketext-Simple-0.21-19.el6.centos.alt.noarch.rpm
康威生命游戏,简单的规则到复杂的稳定
基于参考性的单部六层与六部十层(涵盖1200系列与1500系列仿真)的技术特性分析,单部六层(1200系列、1500系列都有可仿真 ),六部十层1200系列。 有较大参考性。 ,核心关键词:单部六层仿真; 1200系列; 1500系列; 六部十层; 较大参考性。,"六层与十层仿真对比:1200系列与六部1500系列深度解析"
perl516-perl-FCGI-0.74-3.el6.centos.alt.x86_64.rpm
1、文件内容:syslinux-devel-4.05-15.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/syslinux-devel-4.05-15.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
1、文件内容:selinux-policy-sandbox-3.13.1-268.el7_9.2.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/selinux-policy-sandbox-3.13.1-268.el7_9.2.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
反激式开关电源设计方案:高效稳定输出12V 6A,全套原理图与工程文件,BOM表齐全,即建即用,反激式开关电源设计方案,12V6A输出,有完整原理图,PCB工程文件,BOM表,可直接使用。 ,反激式开关电源设计方案; 12V6A输出; 完整原理图; PCB工程文件; BOM表; 可直接使用。,反激式电源设计,12V6A高效输出,完整文件及原理图供现成使用
## 功能特点 1. 数据导入 - 支持Excel文件 - 支持CSV文件 - 数据预览 - 自动识别列 2. 图表类型 - 折线图 - 柱状图 - 饼图 - 散点图 - 箱线图 - 热力图 3. 图表设置 - 自定义标题 - 主题选择 - 轴标签设置 - 样式调整 4. 其他功能 - 实时预览 - 高清导出 - 多种格式 - 简单操作
perl516-perl-Archive-Tar-1.96-1.el6.centos.alt.noarch.rpm
github官网
1、文件内容:sssd-tools-1.16.5-10.el7_9.16.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/sssd-tools-1.16.5-10.el7_9.16.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装
vscode 结合目前图书购物网站的设计方案,本项目在设计时应该满足以下特点。界面设计美观大方、操作简单。功能完善、结构清晰。能够实现前台新书上架功能。能够实现前台新书分类功能。能够实现前台购物车功能。能够实现后台用户管理。能够实现后台订单管理。能够实现后台图书管理。
数据集格式:VOC格式+YOLO格式 压缩包内含:3个文件夹,分别存储图片、xml、txt文件 JPEGImages文件夹中jpg图片总计:1717 Annotations文件夹中xml文件总计:1717 labels文件夹中txt文件总计:1717 标签种类数:7 标签名称:["chuanru","cuokou","duiji","laji","liefeng","nitu","shugen"] 中文对照:穿入、错口、堆积、垃圾、裂缝、泥土、树根 每个标签的框数(注意yolo格式类别顺序不和这个对应,而以labels文件夹classes.txt为准): chuanru 框数 = 328 cuokou 框数 = 200 duiji 框数 = 884 laji 框数 = 610 liefeng 框数 = 836 nitu 框数 = 187 shugen 框数 = 356 总框数:3401 图片清晰度(分辨率:像素):清晰 图片是否增强:否 标签形状:矩形框,用于目标检测识别 重要说明:暂无 特别声明:本数据集不对训练的模型或者权重文件精度作任何保证,数据集只提供准确且合理标注
ollama Ollama 解释 转变 AI 可访问性和语言处理
e2studio开发RA2E1(5)----GPIO输入检测 CSDN文字教程:https://coremaker.blog.csdn.net/article/details/145431876 B站教学视频:https://www.bilibili.com/video/BV1oxPReEEUW/ 本篇文章主要介绍如何使用e2studio对瑞萨单片机进行GPIO输入检测。 首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。 主控为R7FA2E1A72DFL#AA0
基于PLC技术的全自动洗衣机多功能控制系统设计与实现,基于S7-200 PLC组态王组态和触摸屏的洗衣机控制系统的设计 熟悉工业电气控制系统的组成,熟悉PLC系统的设计。 全自动洗衣机能够根据衣物的质地、数量及脏污程度 来实现标准洗涤、柔顺洗涤等多功能模式。 各个功能 模式均包括洗涤、漂洗、排水、脱水等过程,各个 过程的时间设定都与不同模式有关,并且同时能够分 过程单独执行。 编制系统梯形图控制程序,利用组态 王软件进行仿真或作出实物。 重点问题:PLC的选型,如何判断模式的自动选择, 如何判断衣服的数量和脏污程度。 摘要I ABSTRACTII 1 引言- 1 - 1.1设计目的和意义- 1 - 1.2主要设计内容- 1 - 2 总体设计- 2 - 2.1设计要求- 2 - 2.2方案设计- 2 - 3 硬件设计- 4 - 3.1 PLC选择- 4 - 3.2 主电路设计- 4 - 3.3 控制电路设计- 5 - 3.4 PLC输入和输出分配- 6 - 3.5 PLC输入和输出接线图- 7 - 4 软件设计- 9 - 4.1 控制流程图- 9 - 4.2 PLC内部使用地址- 10