hibernate get和load的区别

来源:互联网 发布:linux下源码搭建lamp 编辑:程序博客网 时间:2024/05/21 01:31

hibernate中用于获取数据的方法分成2种分类:

1.加载方式的区别:

   1).立刻加载方法:get   
      所谓的立刻加载就是只要缓存中没有这条记录,就立刻查询数据库

     public class Test2 {


/**
* @param args
*/
public static void main(String[] args) {
Session session=HibernateSessionFactory.getSession();
System.out.println("1: "+session);
session.beginTransaction();
Books b1=(Books)session.get(Books.class, 2);
System.out.println("2: "+session);
session.getTransaction().commit();
HibernateSessionFactory.closeSession();
}

}

执行了以下sql语句:

Hibernate: 
    select
        books0_.id as id0_0_,
        books0_.name as name0_0_,
        books0_.price as price0_0_,
        books0_.opendate as opendate0_0_,
        books0_.enddate as enddate0_0_,
        books0_.author as author0_0_ 
    from
        test.books books0_ 
    where
        books0_.id=?

      通过session获取一个对象后,这个对象会进入session缓存中托管,目的是希望重用数据,这其实就是hibernate中
      所谓的1级缓存(session级别缓存)

     

  2).延迟加载方法:load(慎用,如果在session关闭后才有“必须”查询点就会出现异常)  
     所谓的延迟加载就是在调用方法的时候并没有立刻查询数据库,而是等待“必须”查询点,
load的时候只是返回了一     个proxy对象,这个代理对象中只有id,不管这个id在数据库中是否存在都会返回一个代理对象。没有其他数据,只        有在触发必须查询点时才查询数据库。

     Books b1=(Books)session.load(Books.class, 2);

     此时b1对象中只有id值为2,只有查询b1对象的其他属性时(例如:b1.getName())才查询数据库,执行sql语句


2.get假如获取不到具体的数据,接着对对象进行操作,报空指针异常

    Exception in thread "main" java.lang.NullPointerException
  at com.test.Test2.main(Test2.java:24)

    load假如获取不到具体的数据,接着对对象操作,会报org.hibernate.ObjectNotFoundException异常


3.get对1级缓存可读可写,即查询一次然后将查询结果放入session缓存中,之后便可直接使用缓存中的数据
   load对1级缓存也是可读可写

原创粉丝点击