博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5、Hibernate的延迟加载
阅读量:7283 次
发布时间:2019-06-30

本文共 3656 字,大约阅读时间需要 12 分钟。

1、session.load(User.class,1);

一:了解懒加载

Session session = null;        try {            session = HibernateUtil.openSession();            User u = (User)session.load(User.class, 1);            //此时一条sql都没有发,这就是hibernate的延迟加载            /**             * 延迟加载指的就是,当完成load操作之后,并不会马山发出sql语句,只有在使用到该对象时才会发出sql             * 当完成load之后,u其实是一个代理对象,这个代理对象中仅仅只有一个id的值             */        } catch (Exception e) {            e.printStackTrace();        } finally {            HibernateUtil.close(session);        }

二:清楚什么情况下,会发sql语句

当完成load之后,u其实是一个代理对象,这个代理对象中仅仅只有一个id的值。   所以System.out.println( u.getId() )。也不会发出sql语句。   但是由于name没有值,所以System.out.println( u.getName() ),会发出sql语句。因为必须去数据库取数据。
Session session = null;        try {            session = HibernateUtil.openSession();            User u = (User)session.load(User.class, 1);            //此时一条sql都没有发,这就是hibernate的延迟加载            /**             * 延迟加载指的就是,当完成load操作之后,并不会马山发出sql语句,只有在使用到该对象时才会发出sql             * 当完成load之后,u其实是一个代理对象,这个代理对象中仅仅只有一个id的值             */            //此时不会发sql,因为代理对象中知道id的值             System.out.println(u.getId());            //name没有值,必须去数据库中取。所以会发出sql            System.out.println(u.getName());        } catch (Exception e) {            e.printStackTrace();        } finally {            HibernateUtil.close(session);        }

2、session.get(User.class,1);

一:get()没有延迟加载,只要一调用,就会发出sql语句。
Session session = null;        try {            session = HibernateUtil.openSession();            //get是只要一执行就会发出sql,get没有延迟加载            User u = (User)session.get(User.class, 1);        } catch (Exception e) {            e.printStackTrace();        } finally {            HibernateUtil.close(session);        }

3、在使用session.get()或者session.load()可能会出现的问题

    一:使用session.get()去加载,一个数据库不存在的记录,会出现NullPointerException

         因为,数据库中没有session.get()要加载的记录.所以get()方法会返回一个Null,

         所以调用System.out.println( u.getId() ) 就会出现NullPointerException异常。

        

Session session = null;        try {            session = HibernateUtil.openSession();            //get是只要一执行就会发出sql,get没有延迟加载            User u = (User)session.get(User.class, 101);            //此时由于取了这个数据,发现数据库中并没有该数据,所以u是null,所以会抛出空指针异常            System.out.println(u.getId());        } catch (Exception e) {            e.printStackTrace();        } finally {            HibernateUtil.close(session);        }

      二:使用session.load()去加载,一个数据库不存在的记录,会出现ObjectNotFoundException

           (1)对于u.getId(),由于代理对象,包含id的数值。故不会抛出异常。所以System.out.println( u.getId() ),会输出一个数值。

           (2)对于u.getName(),由于代理对象中不包含name的值,所以System.out.println( u.getName() ),回去数据库中寻找这条记录.

               又因为数据库没有这条记录,但是由于代理对象又有id的数值,故代理对象不为null,此时,回报一个,org.hibernate.ObjectNotFoundException的异常.

Session session = null;        try {            session = HibernateUtil.openSession();            User u = (User)session.load(User.class, 101);            //由于id已经存在,所以不会抛出异常            System.out.println(u.getId());            //此时会去数据库中取数据,发现没有这个对象,但是u并不是空,所以会抛出ObjectNotFoundException            System.out.println(u.getNickname());        } catch (Exception e) {            e.printStackTrace();        } finally {            HibernateUtil.close(session);        }

     三:在Session关闭后,去调用代理对象的除了id的其它属性

         使用了load,load是有延迟加载的,返回的时候的u是一个代理对象,仅仅只有一个id,

        但是在返回的时候Session已经被关闭了,此时当需要使用u的其他属性时就需要去数据库中,

       但是Session关闭了,所以就抛出org.hibernate.LazyInitializationException no session

       

/*         * 由于使用了load,load是有延迟加载的,返回的时候的u是一个代理对象,仅仅只有一个id         * 但是在返回的时候Session已经被关闭了,此时当需要使用u的其他属性时就需要去数据库中         * 但是Session关闭了,所以就抛出org.hibernate.LazyInitializationException no session         */        UserDao ud = new UserDao();        User u = ud.load(2);        System.out.println(u.getUsername());

 

 

转载于:https://www.cnblogs.com/zhangbaowei/p/4853971.html

你可能感兴趣的文章
html表格学习
查看>>
python数据类型 循环语句 循环关键字
查看>>
利用管道完成数据从MySQL到Redis的高效迁移
查看>>
Unity Android真机调试
查看>>
Python使用urllib、urllib2捉取网页内容
查看>>
轻量级的bug管理平台对比
查看>>
keepalived高可用部署
查看>>
linux工程师技术-01 -SElinux、配置高级连接、防火墙管理策略
查看>>
tomcat部署乱码
查看>>
网络安全小实验
查看>>
1月30日
查看>>
forClass
查看>>
每一个关注支付的人都在这里
查看>>
百晓生带你玩转linux系统服务搭建系列-----搭建DHCP服务和中继代理
查看>>
GMO Media 使用 HashiCorp Terraform Enterprise 自动配置基础
查看>>
了解java虚拟机—CMS回收器(8)
查看>>
Lambda plus: 云上大数据解决方案
查看>>
51.使用jdbc操作数据库
查看>>
厉害了!莱西一智能科技企业连获三个智慧城市优秀解决方案
查看>>
springboot mybatis 框架整合源码 集成代码生成器 shiro 权限
查看>>