hibernate一对一懒加载

【SSH三大框架】Hibernate基础第十二篇:load()懒加载分析以及一对一、一对多、多对一、多对多懒加载的分析 一、懒加载的定义: 懒加载:在WEB应用程序中,经常会需要查询数据库,系统的响应速度在很大程度上是与数据库交互的响应。因此,如果能够优化与数据库的交互速度,则能够大大提高WEB应用的响应速度。 例如:当有一个Student类和一个Teacher类。当我们加载一个学生的所有信息,包括:学号,姓名等属性后,此时Student类中的Teacher类型的属性为null,当我们需要知道这个Student 阅读详情

  我们都知道hibernate有延迟加载机制,这样做可以使程序和数据库的交互尽量延迟,直到执行sql或hql命令的时候,也就是说程序不会立即访问数据库,也是由于这个原因有的时候我们会遇到懒加载异常。因为这个时候session已经关闭了,我们就不能访问数据库了。解决的办法有2种:

1.使用Hibernate.initialize(要访问的对象);

2.在映射文件中配置lazy=“false”

 

下面就来看一下一对一的懒加载

在这里先说一下一对多懒加载的条件

(1)从表里的lazy!=true (hibernate默认为proxy)

(2)从表里的constrained=true

(3)从表里的fetch="select"(hibernate默认)

1.来看一下第一种情况

可以先从主表查询从表的信息,这里在主表里设置constrained="true",配置文件如下

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.test.annotations">

    <class name="org.lxh.vo.Person" table="person" >

        <id name="id" column="id">
            <generator class="increment"/>
        </id>

        <property name="name" column="name"/>
        
        <!-- <many-to-one name="card" unique="true"/> -->
        <one-to-one name="card" constrained="true"/> 
        
    </class> 

</hibernate-mapping>


我们先从主从查询主表,代码如下

public String load(){
        Session ses=null;
    	
    	Transaction tr=null;
    	Card card=null;
    	Person p=null;
    	try{
    		ses=HibernateUtil.getThreadLocalSession();
    		tr=ses.beginTransaction();
    		card=(Card)ses.get(Card.class, 1);
    		    		
    		tr.commit();      //将事务提交
    	}catch(Exception e){
    		e.printStackTrace();
    	}finally{
    		if(ses!=null){
    			//ses.close();  //关闭连接,否则会把数据库卡死
    			HibernateUtil.colseSession();
    		}
    	}
    	return card.getPerson().getName();
    	//return p.getCard().getBirthday();
    }

在这里查询会成功,也就是说主表不会懒加载,但是我们从主表查询从表就会出现懒加载异常。但是如果我们在配置文件里这么写

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.hibernate.test.annotations">

    <class name="org.lxh.vo.Card" table="card" >  <!-- 解决方法2 -->

        <id name="id" column="id">
            <generator class="foreign">
              <param name="property">person</param>
            </generator>
        </id>

        <property name="birthday" column="birthday"/>
        <one-to-one name="person" constrained="true"/> 
        
    </class> 

</hibernate-mapping>


此时通过从表查询主表就会出异常,这是因为配置了constrained="true"那么关联关系就是强制性的,hibernate不会去确认关联关系是否存在(不会去访问数据库),所以就产生了异常,至于其他的条件例如lazy和fetch,二者之间是相互制约的关系,如果fetch=“join”,那么配置lazy=“proxy”就不起作用了。这次就到这里,在一对一中使用懒加载对性能并没有明显提升,但是在其他关联关系中就不同了。

hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法 主要介绍了hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法,需要的朋友可以参考下 立即下载

相关推荐

四旋翼无人机控制算法实战:从PID到MPC的路径跟踪

本文深入探讨了四旋翼无人机控制算法的演进路径,从基础的PID控制到高级的MPC算法,详细解析了各类算法的原理、实现技巧及适用场景。通过实战案例对比分析,为开发者提供从算法选型到参数调优的全方位指导,助力提升无人机飞行控制的精度与稳定性。

weixin_29090917的博客 240

Hibernate(三)

对象的状态举例: User user = new User();Hibernate中对象的状态: 临时/瞬时状态、持久化状态、游离状态。 临时状态特点: 直接new出来的对象; 不处于session的管理; 数据库中没有对象的记录; 持久化状态 当调用session的save/saveOrUpdate/get/load/list等方法的时候,对象就是持久化

gafeng123456的博客 586

XIAO ESP32S3 Sense摄像头与麦克风实战:从硬件连接到AI语音视觉项目

本文详细介绍了如何使用Seeed Studio XIAO ESP32S3 Sense开发板进行AI语音视觉项目开发。从硬件连接到Arduino环境搭建,再到摄像头拍照、视频流传输、麦克风录音等实战操作,最后引导读者探索基于TensorFlow Lite Micro的语音唤醒和SenseCraft AI的图像识别等AI应用,为物联网和边缘AI项目提供了完整的入门指南。

xray4的博客 1022

Hibernate @OneToOne懒加载实现解决方案

在hibernate注解(三)中,我提高过一对一(@OneToOne)懒加载失效的问题。虽然给出了解决方法,但并没有给出完整的解决方案。今天我专门针对该问题进行讨论。至于懒加载失效的原因,在之前的文章中已经我已经叙述过了,就不再重复了,不明白的可以去看看。

鹏霄万里展雄飞 2万+

更新3ds时和用读卡器读取传输文件操作不当导致的tf卡损坏无法读取需要格式化时出现的问题以及不想丢失文件并且修复的详细解决方法

前言: 不小心按了同意更新而且tf/sd卡损坏导致了3ds打开后都是出现 Anerror has occurred:(红色的) Failed to apply 1 FIRM patch(es). Press any button to shotdown 这样的画面,按了任意键后就关机,我找了很多资料和大佬的回答解决了这些问题,现在记录一下。 一.不小心按了更新导致上述的画面 原因:是因为系统升级了,但是里面的Luma3DS还没有更新,属于是更新了但没有完全更新的状态。 **修复方法** 1.首先请按

give_me_fish的博客 1万+

别再死记硬背了!用TwinCAT 3手把手教你配置EtherCAT伺服驱动的PDO映射(DS402协议)

本文详细介绍了如何使用TwinCAT 3配置EtherCAT伺服驱动的PDO映射(DS402协议),涵盖环境准备、设备扫描、PDO映射实战及高级技巧。通过具体操作步骤和常见问题排查,帮助工程师快速掌握EtherCAT通信配置,提升运动控制系统的效率和稳定性。

weixin_29185493的博客 321

one-to-one的懒加载及原理分析

Lazy=”” :告诉hibernate什么时候抓取 1 false :立即抓取,查询此对象同时查询关联对象 2 proxy :不立刻抓取关联对象 3 no Fetch:告诉Hibernate通过什么方式抓取 1 select (缺省) :通过select抓取(相关联的两个对象通过两条select 语句查询) 2 join :通过join方式将关联的数据都查出来(效率比较高)||此时l...

跑步走,到底是是跑还是走? 362

手把手教你学 GPU KMD”相关内容的专栏简介与目录

本专栏系统讲解GPU内核模式驱动(KMD)开发技术,涵盖四大核心模块:1)GPU驱动架构基础,解析UMD/KMD协同机制;2)KMD核心功能,包括内存管理、命令提交、中断处理等;3)底层硬件交互,详解PCIe/DMA传输、多级页表等;4)实战进阶,结合Linux DRM框架代码分析,探讨GPU虚拟化与性能优化。面向具备OS和C语言基础的开发者,提供从理论到实践的完整学习路径,帮助深入理解图形/计算驱动栈的底层实现原理。

amy_mhd的博客 153

为什么要用双向关联

无效,因为@OneToOne自带unique约束。父端并不知道子端是否重复,所以会去查所有子元素。 这涉及到了n+1的问题(感觉1+n更妥当) 那么OneToOne就一定不能懒加载么,不是的,可以通过@LazyToOne( LazyToOneOption.NO_PROXY ) 来实现,代码: @OneToOne( mappedBy = "phone", cascade = CascadeT...

enthan809882的博客 527

【WSN定位】基于AOA算法实现目标无源定位附matlab代码

1 简介 2 部分代码 clear all; close all; clc;​stations = [0 0 0;20 0 0]; %基站位置​X = -100:100; %生成目标位置Y = X.*sin(X);Z = X+Y;N = length(X);Locations = zeros(N,3);angs = zeros(N,4);for i = 1:N angs(i,:) = Angs(stations*1e3,[X(i),Y(i),Z(i)]*1e3);end​for

qq_59747472的博客 2308

深度解析与实战:长短时记忆网络(LSTM)在股票走势预测中的应用(基于Python + PyTorch)

本文全面探讨了LSTM在股票价格预测中的应用,从理论基础到实践操作。文章首先强调了股票市场预测的重要性,并介绍了LSTM网络结构及其在处理时间序列数据中的优势。接着,详细说明了数据预处理的关键步骤,包括数据收集、清洗、特征选择和归一化。文章还讨论了LSTM模型的构建、训练和评估,并提供了Python及PyTorch的实操案例。最后,总结了LSTM在股票预测的成果,并提出了未来研究的方向,如模型优化和特征工程,旨在帮助读者掌握LSTM在股票价格预测中的应用,并探索提升模型性能的方法。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2100

Hibernate一对一,一对多懒加载的要求

懒加载要求Domain对象不能是final的,因为Hibernate需要生成一个继承自该Domain对象的类来实现懒加载。懒加载主要有三种: 1. 对象的懒加载 2. 关联集合的懒加载 3. 对象属性的懒加载 对象的懒加载 对象的懒加载就是在映射文件的class标签中设置lazy属性为true,这时,如果用session.load方法获取这个对象的话,Hibernate只返回一个代理对象

bksqmy的专栏 2437

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

hibernate学习笔记16--一对一实现懒加载

一对一的懒加载分析: test.java 还是使用先前那个Person和IdCard的一对一例子例子 [java] view plaincopyprint? import hibernate.HibernateUtil;    import java.util.Date;    import org.hibernate.Hibernate;  import org.

韬晦潜胖蛇的专栏 1966

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

hibernate关联关系中的一对一以及懒加载的原理:lazy和fetch的理解

******************** Person.java主对像 ******************** package blog.hibernate.domain; public class Person { private int id; private String name; private IdCard idCa...

SYL269794967的博客 246

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

hibernate 一对一关联关系 及其懒加载,总结

一对一,则有主对象和从对象之区别 若无主对象,则从对象亦无存在之意义。 主对象为person 从对象为idcard <hibernate-mapping package="cn.itcast.hibernate.domain"> <class name="Person"> <id name="id"> ...

weixin_30257433的博客 106

Java进阶学习第二十天(Hibernate框架:集合映射、关联映射、对象的状态、一级缓存、懒加载、一对一映射、组件映射、继承映射)

一、集合映射 需求: 用户网上购物填写地址(一对多) 1、javabean设计 public class User { private int userId; private String userName; // 一个用户,对应的多个地址 private Set&amp;amp;amp;lt;String&amp;amp;amp;gt; address; private List&amp;amp;amp;lt;String&amp;am

_Gerald的博客 419

Hibernate懒加载解析

Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。 我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。

雪狼小记 1万+

Hibernate懒加载分析

1 session.Load懒加载 之前在介绍Hibernate几个方法的时候,已经提到了这个load方法 当我们从脱管态的对象查询的时候,返回的不是查询数据库的对象,而是返回的是一个代理对象,hibernate没有去查询数据库,并报了一个LazyInitializalationException异常 那返回代理对象到底是个什么对象呢 根据测试: User user=

咖啡 493

hibernate的懒加载和查询

1:hibernate的懒加载(通过asm和cglib包实现)代理对象实现2:单个对象的查询   总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;   而对于get方法,hibernate一定要获取到真实的数据,否则返回null。get()方法与load()方法的区别就

sutku的专栏 3073

hibernate懒加载原理

懒加载的意思是查询的时候不会立刻访问数据库,而返回的是代理对象,当真正去使用对象字段的时候才会访问数据库。 load(Object, Serializable):前提实体类不能是final的。根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。 用load的时候会发现不会打印出查询语句,而使用get的时候会打印出查询语句。 使用load时

写博客只为学习 637

hibernate 一对一

一对一(one-to-one)实例(Person-IdCard) 一对一的关系在数据库中表示为主外关系.例如.人和身份证的关系.每个人都对应一个身份证号.我们应该两个表.一个是关于人信息的表(Person).别外一个是身份证相关信息的表(id_card).id_card表的主键对应该Person表的主键id,也是Person表的外键.有人才能有身份证.所以此例中Person是主表,id_card

lengfeng1991的专栏 340

解决Hibernate 注解在属性上 ,多对一,一对一懒加载 当调用one那一方getId 也会查数据库的问题

使用 hibernate5.10 版本 spring boot jpa 搭建测试 首先这个问题出现的原因是把注解写在了属性上并且fetchType=lazy,写在属性上找起来方便,但是也带了一个问题,就是在getOne那一方的id的时候会查询数据库,这是我们不希望的,我们可能更想要的是在调用类似getName的方法时候查询数据库。 出现这种情况的原因是hibernate并不能找到getIden

u013133454的博客 1769
上一篇: hibernate多对多关联关系
下一篇: hibernate,struts2的工作原理
青蛙小王子
博客等级 码龄16年 239粉丝 311原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值