Hibernate单表操作(六)——查询记录get()与load()方法区别

转载请注明:http://blog.csdn.net/uniquewonderq

在上一次的案例中,通过get或者load方法得到的结果一样。

既然得到的结果一样,

那么  get和load方法查询记录的区别是什么呢?

区别一

在不考虑缓存的情况下,get方法会在调用之后立即向数据库发出sql语句,发出selelct语句,去查找这个记录或者说对象,返回本身的持久化对象。

load方法会在调用后返回一个代理对象。

该代理对象只保存了实体对象的主键id,直到真正使用对象的非主键属性时才会发出sql语句。

区别二:

查询数据库中不存在的数据库时,get方法返回null。

load方法抛出异常:org.hibernate.ObjectNotFoundException

用代码来测试说明以上两点:

@Test
		public void testGetStudents(){
			Students s=(Students) session.get(Students.class,1);
			System.out.println(s.getClass().getName());
			//System.out.println(s);
		}

测试结果(控制台输出):

注意了注意了,这里我已经把

System.out.println(s);

语句注释掉了。但是还是会发出sql语句。

继续测试:

@Test
		public void testLoadStudents(){
			Students s=(Students) session.load(Students.class,1);
			System.out.println(s.getClass().getName());
			//System.out.println(s);
		}

测试结果:

这里我也把那条输出语句注释了,但是因为这时候没有必要使用非主键属性,所以并没有发出sql语句。这就是load方法的特点。

其次,输出的类名就不是真正的类名。是代理对象对应的类名。所以并不是一个持久化对象。

再进行测试验证不存在的返回值情况:

	@Test
		public void testGetStudents(){
			Students s=(Students) session.get(Students.class,10);
			//System.out.println(s.getClass().getName());
			System.out.println(s);
		}

现在将查询的主键序列改为了10,因为数据库中没有该主键对应的记录。所以get()方法会返回null。

而如果使用load方法,会出现异常!

		@Test
		public void testLoadStudents(){
			Students s=(Students) session.load(Students.class,10);
			//System.out.println(s.getClass().getName());
			System.out.println(s);
		}

测试结果:

只发出了sql语句,但是没有返回任何东西,异常信息如下:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [Entity.Students#10]

大概的意思就是:找不到对象。所给的标识符10,并不存在(那一行)。

时间: 2024-08-02 10:58:18

Hibernate单表操作(六)——查询记录get()与load()方法区别的相关文章

【Hibernate】(3)Hibernate单表操作

1. 单一主键 这个是在我们生成的Student.hbm.xml中配置的: <hibernate-mapping> <class name="com.thr.bean.Student" table="STUDENT"> <id name="id" type="int"> <column name="ID" /> <generator class=&quo

Hibernate单表操作(四)——组件属性

转载请注明:http://blog.csdn.net/uniquewonderq 1.什么是组件属性呢? 它是指:实体类中的某个属性属于用户自定义的类的对象. 理解起来还是不容易:所以写点代码来说明问题: 首先添加一个地址类: package Entity; //地址类 public class Address { private String postcode;//邮编 private String phone;//电话 private String address;//地址 public A

Hibernate单表操作(二)——基本类型

转载请注明:http://blog.csdn.net/uniquewonderq 基本类型表单列表: 还有另外一张表 以上这些属性可以在 hbm.xml的文档中的type类型进行更改.

Hibernate单表操作(三)——对象类型

转载请注明:http://blog.csdn.net/uniquewonderq 对象类型: Mysql不支持标准SQL的CLOB类型,在Mysql中使用TEXT,MEDIUMTEXT及LONGTEXT类型来表示长度超过 255的长文本数据. 下面看一个例子来演示: @Test public void testWriteBlob() throws Exception {//写入二进制数据 Students s=new Students(6,"wonderq","男"

Hibernate单表操作(一)——单一主键

assigned由java应用程序负责生成.(手工赋值) native由底层数据库自己主动生成标识符,假设是MySQL就是increment,假设是oracle就是sequence.等等.

hibernate单表映射

什么是Hibernate? ORM:object relationship mapping对象关系映射 hibernate是java领域的一款开源的ORM框架技术. hibernate是对jdbc进行了非常轻量级的对象封装. 1.开发工具:Eclipse Standard Kepler Hibernate Tools for eclipse Plugins Hibernate Tools是由JBoss推出的一个Eclipse综合开发工具插件,该插件可以简化ORM框架Hibernate,以及JBo

Hibernate学习笔记(一)--&gt;数据库单表操作

Hibernate框架是一个全ORM映射框架,是一个非常流行的数据库操作框架之一,现在比较流行的还有MyBatis半ORM映射框架 在MyEclipse IDE开发工具中,可以很轻松的搭建Hibernate框架. 一.搭建一个项目 1.首先在MyEclipse中搭建一个web项目. 2.选中项目右键-->myeclipse-->Project Facets-->找到hibernate.这样就为项目添加了hibernate支持 3.打开hibernate.cfg.xml配置文件,在可视化编

查询语句 select [单表操作]

---SQL单表简单查询1.单表操作&别名的使用 1 --查询表的所有数据:select * from 表名;通配符*代表所有 2 select * from emp; 1 --查询表中指定字段的值:select 字段名1,字段名2,... from 表名; 2 select empno,ename,job,sal,hiredate,comm from emp; 1 --查询结果中的字段使用别名:作用[方便查看查询结果] 2 --在字段名后使用关键字 字段名 as "别名" 3

八:SQL之DQL数据查询语言单表操作

前言: DQL数据库查询语言是我们在开发中最常使用的SQL,这一章总结了单表操作部分的常用查询方式 主要操作有:查询所有字段.查询指定字段.查询指定记录.带IN的关键字查询,范围查询,陪查询.查询空值 带AND的多条件查询.带OR的多条件查询,关键字DISTINCT,查询结果排序,分组查询.分页查询等 准备好数据测试表 1 mysql> select * from student; 2 +------+----------+-------+----------+-------------+ 3