Hibernate的加载方式——GET与LOAD的对比
来源:互联网 发布:tsp 组合优化问题 编辑:程序博客网 时间:2024/06/05 17:19
区别
同上,在执行到load方法时,load方法会首先查询session中是否存在缓存,如果存在则直接返回,如果不存在则会判断是否为lazy,这里设置的是lazy方式,因此load方法会认为数据库中存在数据,直接建立代理对象,把代理对象返回给user。
从返回的结果上来看,get、load在检索到数据的时候,会返回对象(代理对象或实体对象),但他们的检索方式不同,这个后续在细说。get检索不到数据的时候,会返回null;而load检索不到数据会返回org.hibernate.ObjectNotFoundException。下面通过两个例子来分析一下get与load的工作原理。
工作原理
Get加载(数据库中存在检索的数据),这里只分析测试类,实体类就不再讨论了。
- <SPAN style="FONT-FAMILY: Microsoft YaHei; FONT-SIZE: 18px">/**
- * 查询数据库中有数据的字段
- */
- public void testGetNotNull() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- // 数据库中存在id为2的数据
- <SPAN style="COLOR: #ff0000">User user = (User)session.get(User.class, 2);</SPAN>
- System.out.println("---------Get加载--------");
- System.out.println(user);
- System.out.println(user.getId() + "---->>" + user.getName());
- System.out.println("------------------------");
- session.getTransaction().commit();
- } catch (Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- } finally {
- HibernateUtils.closeSession(session);
- }
- }</SPAN>
/** * 查询数据库中有数据的字段 */public void testGetNotNull() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();// 数据库中存在id为2的数据User user = (User)session.get(User.class, 2);System.out.println("---------Get加载--------");System.out.println(user);System.out.println(user.getId() + "---->>" + user.getName());System.out.println("------------------------");session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();session.getTransaction().rollback();} finally {HibernateUtils.closeSession(session);}}
Get加载(数据库中不存在检索的数据)
- <SPAN style="FONT-FAMILY: Microsoft YaHei; FONT-SIZE: 18px">/**
- * 查询数据库中不存在的数据
- */
- public void testGetWithNull() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- // 数据库中不存在id为0的数据
- <SPAN style="COLOR: #ff0000">User user = (User)session.get(User.class, 0);</SPAN>
- System.out.println("---------Get加载--------");
- System.out.println(user);
- //System.out.println(user.getId() + "---->>" + user.getName());
- System.out.println("------------------------");
- session.getTransaction().commit();
- } catch (Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- } finally {
- HibernateUtils.closeSession(session);
- }
- }</SPAN>
/** * 查询数据库中不存在的数据 */public void testGetWithNull() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();// 数据库中不存在id为0的数据User user = (User)session.get(User.class, 0);System.out.println("---------Get加载--------");System.out.println(user);//System.out.println(user.getId() + "---->>" + user.getName());System.out.println("------------------------");session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();session.getTransaction().rollback();} finally {HibernateUtils.closeSession(session);}}
Load加载(数据库中存在检索的数据)
- <SPAN style="FONT-FAMILY: Microsoft YaHei; FONT-SIZE: 18px">/**
- * 数据库中存在查询的数据
- */
- public void testLoadNotNull() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- // 数据库中存在id为2的数据
- <SPAN style="COLOR: #ff0000">User user = (User)session.load(User.class, 2);</SPAN>
- System.out.println("----------Load加载-----------");
- System.out.println(user);
- System.out.println(user.getId() + "---->>" + user.getName());
- System.out.println("-----------------------------");
- session.getTransaction().commit();
- } catch (Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- } finally {
- HibernateUtils.closeSession(session);
- }
- }</SPAN>
/** * 数据库中存在查询的数据 */public void testLoadNotNull() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();// 数据库中存在id为2的数据User user = (User)session.load(User.class, 2);System.out.println("----------Load加载-----------");System.out.println(user);System.out.println(user.getId() + "---->>" + user.getName());System.out.println("-----------------------------");session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();session.getTransaction().rollback();} finally {HibernateUtils.closeSession(session);}}
Hibernate中,load方法是支持延迟加载的,在执行到User user = (User)session.load(User.class, 2);这条语句时,load方法首先会查找session的persistent Context中是否存在缓存,如果存在则直接返回;如果没有缓存,则load方法会判断是否是lazy加载,如果不是lazy方式,则直接访问数据库,查询Id为2的数据,由于数据库中存在Id为2的数据,因此get方法会返回实体对象。
如果load方法判断的是lazy方式加载,那么就需要建立代理对象,对象的initialized属性为false,target属性为null,在访问获得的代理对象的属性时,会访问数据库,找到记录后就会把该记录的对象复制到代理对象的target上,并将initialized属性设为true。在这个例子中,load方法采用的是lazy方式,因此在执行load方法时,Hibernate不会发出sql语句,因为此时Hibernate建立了代理对象,但并没有访问代理对象的属性。当执行System.out.println(user);时,Hibernate才会初次发出sql语句,去查询数据库。如下图:
Load加载(数据库中不存在检索的数据)
- <SPAN style="FONT-FAMILY: Microsoft YaHei; FONT-SIZE: 18px">/**
- * 数据库中不存在查询的数据
- */
- public void testLoadWithNull() {
- Session session = null;
- try {
- session = HibernateUtils.getSession();
- session.beginTransaction();
- // 数据库中不存在id为0的数据
- <SPAN style="COLOR: #ff0000">User user = (User)session.load(User.class, 0);</SPAN>
- System.out.println("----------Load加载-----------");
- System.out.println(user);
- //System.out.println(user.getId() + "---->>" + user.getName());
- System.out.println("-----------------------------");
- session.getTransaction().commit();
- } catch (Exception e) {
- e.printStackTrace();
- session.getTransaction().rollback();
- } finally {
- HibernateUtils.closeSession(session);
- }
- }</SPAN>
/** * 数据库中不存在查询的数据 */public void testLoadWithNull() {Session session = null;try {session = HibernateUtils.getSession();session.beginTransaction();// 数据库中不存在id为0的数据User user = (User)session.load(User.class, 0);System.out.println("----------Load加载-----------");System.out.println(user);//System.out.println(user.getId() + "---->>" + user.getName());System.out.println("-----------------------------");session.getTransaction().commit();} catch (Exception e) {e.printStackTrace();session.getTransaction().rollback();} finally {HibernateUtils.closeSession(session);}}
而执行到System.out.println(user);时,Hibernate会发出sql语句,访问数据库查询Id为0的数据,由于数据库中不存在Id为0的数据,因此load方法会返回org.hibernate.ObjectNotFoundException,直接抛出异常。如下图:
<DIV style="TEXT-ALIGN: center
<DIV style="TEXT-ALIGN: center
0 0
- Hibernate的加载方式——GET与LOAD的对比
- Hibernate的加载方式——GET与LOAD的对比
- hibernate加载持久化对象的两种方式——get、load
- Hibernate两种加载数据的方式get()和load()
- hibernate的两种加载方式get和load
- Hibernate是如何延迟加载?get与load的区别
- hibernate数据加载get/load的区别
- hibernate数据加载get/load的区别
- hibernate--get load延迟加载的问题
- hibernate检索方式——get和load检索方式的区别
- hibernate的load与get的区别
- Hibernate的get与load的区别
- hibernate中get()与load()的区别
- 【网络搜集】HIBERNATE的GET与LOAD
- hibernate中get()与load()的区别
- hibernate中get与load的区别
- Hibernate中 get与load的区别
- Hibernate的session.get()与load()区别
- “爱”让我们去努力
- 乘法口诀表
- ubuntu 重装系统后该做的事情
- 嵌入式学习之路(八)——C语言学习(3)
- 字符段长度
- Hibernate的加载方式——GET与LOAD的对比
- sencha touch笔记(6)——路由控制(1)
- Flume OG 介绍和配置
- SSH动态查询具体实现之service
- 写了份装B代码
- 弧垂计算
- 手机iphone ios android 打开QQ对话框的网页代码!
- 利息计算器
- 【IOS游戏开发】之 一年两次加速审核机会