Hibernate学习_007_get()与load()的区别
来源:互联网 发布:sql server2008 下载 编辑:程序博客网 时间:2024/06/05 20:23
当要从数据库中加载一个对象的时候,我们常常会使用两个方法,load()方法和get()方法,这两个方法虽然都可以取出数据库中的数据,但是这两个方法是有很大区别的。他们的区别主要表现在以下几点:
第一:是否立即发出Sql语句。
使用get方式:
@Testpublic void testSession() {Session session = sf.getCurrentSession();session.beginTransaction();Teacher t = (Teacher)session.get(Teacher.class, 1);//使用get方式。 session.beginTransaction(); session.getTransaction().commit();}使用这种方式会立马发出sql语句,马上取出数据库中的对象。
Hibernate: select teacher0_.id as id1_0_, teacher0_.name as name1_0_, from _Teacher teacher0_ where teacher0_.id=?使用load方式:
@Testpublic void testSession() {Session session = sf.getCurrentSession();session.beginTransaction();Teacher t = (Teacher)session.load(Teacher.class, 1);//使用load方式 session.beginTransaction(); session.getTransaction().commit();}使用load方式,是不会立刻产生sql语句的。看下面这个实验就会明白,使用load的时候,是真正在使用对象的时候才会发出sql语句。
@Testpublic void testSession() {Session session = sf.getCurrentSession();session.beginTransaction();Teacher t = (Teacher)session.load(Teacher.class, 1);System.out.println("此时还没有发出Sql语句!!!!");System.out.println("使用对象是,才发出SQL语句,对象的名字是:"+t.getName()); session.beginTransaction(); session.getTransaction().commit();}输出结果:
此时还没有发出Sql语句!!!!Hibernate: select teacher0_.id as id1_0_, teacher0_.birthDay as birthDay1_0_, teacher0_.myWifeName as myWifeName1_0_, teacher0_.name as name1_0_, teacher0_.title as title1_0_, teacher0_.zhicheng as zhicheng1_0_ from _Teacher teacher0_ where teacher0_.id=?使用对象是,才发出SQL语句,对象的名字是:t1从输出结果可以看出,确实load不会立刻发出SQL查询语句。
第二:这两个方法的返回值不一样。load返回的是代理对象(这个代理对象时真实类的子类。),而get方式返回的是真实类的对象。
load方法返回的是原来真实类的子类对象,也就是真实类的代理。
@Testpublic void testSession() {Session session = sf.getCurrentSession();session.beginTransaction();System.out.println(session.load(Teacher.class, 1).<span style="color:#ff0000;">getClass()</span>); session.beginTransaction(); session.getTransaction().commit();}查看输出:
class com.zxb.model.Teacher_$$_javassist1从输出我们可以看到,返回的并不是我们的Teacher类,而是一个加了后缀javassist的类,这个类就是一个代理类,javassist是java中专门生产代理和产生二进制代码的一个类。 而当我们使用get方法的时候,我们就会发现,输出的是真实类的对象,代码输出结果如下,测试代码再次不给出,load换get即可。
class com.zxb.model.Teacher
第三:在数据库中没有要加载的数据项时,程序反映不一样。
其实,这一点很好理解,load的时候,压根就没发出SQL语句查数据库,所以就是数据不存在,也不会报错,但真正在使用对象的时候,数据不存在,才会发出lazyInitializationException,而get方法是立刻发出SQL语句,如果数据库中不存在对应数据,则程序会立马报错。
综上所述,为了及时返现程序中的错误,我们在程序中一般使用get方法来加载数据。而不是使用load方法。
0 0
- Hibernate学习_007_get()与load()的区别
- hibernate的load与get的区别
- Hibernate的get与load的区别
- hibernate中get()与load()的区别
- hibernate中get()与load()的区别
- hibernate中get与load的区别
- Hibernate中 get与load的区别
- Hibernate的session.get()与load()区别
- hibernate中get()与load()的区别
- HIbernate中的load与get的区别
- Hibernate 中get与load的区别
- Hibernate中load与get的区别
- hibernate中load()与get()的区别
- Hibernate get()与load()的区别
- hibernate 中的get与load的区别
- Hibernate get与load的区别
- Hibernate load与get的区别
- hibernate的load与get区别
- jzojNOIP2014模拟 8.14总结
- 高级PHPer面试题
- 关于C++ const 的全面总结
- HBase中的Client如何路由到正确的RegionServer
- [LeetCode]-Combination Sum I&II 求相加和为target的集合
- Hibernate学习_007_get()与load()的区别
- 自己写的一个简单的IOC容器
- 登录sqlplus
- OC内存管理的初级理解
- 2014-08-14 日志
- Linux服务器挂死案例分析
- Android Binder机制----实现自定义的系统服务
- 中山大学软件学院中级实训-GridWorld
- 学习日记之享元模式和Effective C++