标签:数据库 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