hibernate session的get和load方法

2024-08-26 01:32

本文主要是介绍hibernate session的get和load方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在hibernate中如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get(),另一种是通过session.load方法,下面具体说一下这两种方法。

1、load方式加载

使用load方法来加载一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象。也就是说,当使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前的到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。

//不会马上发出查询语句,因为load支持lazy(延迟加载/懒加载)
//什么叫lazy?只有真正使用这个对象的时候,再创建,对于hibernate来说
//才真正的发出查询语句,主要为了提高性能,lazy是hibernate中非常重要特性
//hibernate的lazy是如何实现的?采用代理对象实现,代理对象主要采用的是CGLIB库生成的
//而不是JDK的动态代理,因为JDK的动态代理只能对实现了接口的类生成代理,CGLIB可以对类
//生成代理,它采用的是继承方式。
User user=(User)session.get(User.class, "402895f0594e74db01594e74dd190002");
System.out.println(user.getName());
user.setName("王柳");

其实,在这里可以这样理解:load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上去DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询,即我们常说的load在默认情况下支持延迟加载。

***采用load方法查询不存在的数据,hibernate会抛出objectNotFoundException对象。


2、get方式加载

相对于load的延迟加载方式,get就直接的多,但我们使用session.get()方法来得到一个对象时,不管使不使用这个对象,都会发出sql语句去从数据库中查询。

//get加载上来的对象为持久对象
//执行get会马上发出查询语句。
User user=(User)session.get(User.class, "402895f0594e5ab301594e5ab4140001");
System.out.println(user.getName());
user.setName("赵六");
get方法先到缓存(session缓存/二级缓存)中去查,如果没有就到DB中去查(即马上发出sql)

***采用get方法查询不存在的数据时,直接返回null。


【深入理解】

get方法和load方法都是根据id去获取相应的数据的,但是机制不同,如果使用get方法,hibernate回去确认该id对应的数据是否存在,它首先去session中去查询,如果没有再去二级缓存中去查询,如果再没有,就去数据库中查询,仍然没有找到的话,就返回null;而使用load方法的话,hibernate会认定该id对应的数据一定存在,它也会先去session缓存中去查找,如果没有找到,hibernate会根据lazy属性值来确定是否使用延迟加载。如果lazy="true",就使用延迟加载,返回该代理对象,等到真正访问到该对象的属性时才会去二级缓存中查询,如果再没有,再去数据库中查询,如果还没有,就抛出org.hibernate.ObjectNotFoundException异常,如果lazy="false",则不使用延迟加载。


【小结】

hibernate的load方法和get方法的主要区别在于是否延迟加载。

load方法不会立即访问数据库,当试图加载的记录不存在是,load方法返回一个未初始化的代理对象;get方法总是立即访问数据库,当试图访问的记录不存在时,直接返回null。根据这个特性可以解决一些异常错误。


这篇关于hibernate session的get和load方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Olingo分析和实践之ODataImpl详细分析(重要方法详解)

《Olingo分析和实践之ODataImpl详细分析(重要方法详解)》ODataImpl.java是ApacheOlingoOData框架的核心工厂类,负责创建序列化器、反序列化器和处理器等组件,... 目录概述主要职责类结构与继承关系核心功能分析1. 序列化器管理2. 反序列化器管理3. 处理器管理重要方

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu