码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2015-06-25 17:35:38      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:数据库   hibernate   junit   测试   mysql   

转载请注明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,并不存在(那一行)。




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

标签:数据库   hibernate   junit   测试   mysql   

原文地址:http://blog.csdn.net/uniquewonderq/article/details/46637073

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!