load和get都会可以起到从数据库中获取持久态数据的作用,但是还有些稍微的区别的。

参考下面的这个例子:

@Test(expected = IllegalArgumentException.class)
public void testLazyLoad() throws Exception {// 启动Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();User user = (User)session.load(User.class, 100L);  // 不存在的IDtry {user.getName();} catch (ObjectNotFoundException ex) {// 命中数据库发现没有对象即抛出ObjectNotFoundException异常throw new IllegalArgumentException("随便抛出一个不可能的异常");}tx.commit();session.close();
}@Test(expected = IllegalArgumentException.class)
public void testLazyLoad() throws Exception {// 启动Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();User user = (User)session.load(User.class, 100L);  // 不存在的IDAssert.assertTrue(user instanceof HibernateProxy);user.getId();  // 由于ID是不被延迟加载的属性,因此不会抛出异常try {Hibernate.initialize(user);  // 触发命中数据库//user.getName();} catch (ObjectNotFoundException ex) {// 命中数据库发现没有这个对象抛出ObjectNotFoundException异常throw new IllegalArgumentException("异常");}tx.commit();session.close();
}

1. 在这里可以看出load并没有直接获取数据,而是获取到的代理对象-->HibernateProxy,如果不获取简单类型的属性的时候是不会抛出异常的,但是get不一样,他直接去数据库中取,他得到的是对象本身,如果得不到的话就会返回空值。

再看一个例子:

@Test
public void testGetAndLoadSession() throws Exception {// 启动Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();// load在缓存为空的情况下是否会使得加载的对象过一级缓存User user1 = (User)session.load(User.class, 1L);  // 存在的ID,此时虽然没有解开Proxy但已经进入缓存Assert.assertTrue(user1 instanceof HibernateProxy);Hibernate.initialize(user1);  // 解开Proxy,会触发命中数据库操作User user3 = (User)session.get(User.class, 1L);Assert.assertTrue(user3 instanceof HibernateProxy);  // 即使使用get,但由于缓存中存储的是一个Proxy,所以这里得到的也是ProxyHibernate.initialize(user3);  // 解开Proxy,但不会命中数据库// 验证在load一个不存在的ID后,不解开然后getUser user4 = (User)session.load(User.class, 100L);  // 不存在的ID,仍然将Proxy进入缓存Assert.assertTrue(user4 instanceof HibernateProxy);//Hibernate.initialize(user3);  // 不解开Proxytry {session.get(User.class, 100L);  // 得到Proxy,命中数据库尝试解开Proxy,由于ID不存在因此抛出异常Assert.fail("ID不存在所以会出错,不会执行本条");} catch (ObjectNotFoundException ex) {}// 清空缓存session.clear();// 验证缓存为空的情况下get是否为ProxyUser user6 = (User)session.get(User.class, 1L);  // 命中数据库,直接将组装完成的User实体进入缓存Assert.assertTrue(!(user6 instanceof HibernateProxy));// 验证get从缓存中取出对象User user7 = (User)session.get(User.class, 1L);Assert.assertTrue(!(user7 instanceof HibernateProxy)); // 缓存中是真实的User对象,get取出的就是真实的User对象// 验证load是否从一级缓存取数据User user8 = (User)session.load(User.class, 1L);Assert.assertTrue(!(user8 instanceof HibernateProxy));  // 缓存中是真实的User对象,load取出的也是真实的User对象tx.commit();session.close();
}

2. 如果是load方法将对象加载到了缓存当中,那么在get和load的时候得到的都是代理对象,但是如果是get方法将对象加载到了缓存中的时候,那么在get和load的时候得到的是一个实体对象。

Hibernate之load和get的区别相关推荐

  1. hibernate get() load() 区别

    来源:互联网 1.hibernate中get方法和load方法的根本区别在于:如果你使用load方法,hibernate 认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用 ...

  2. hibernate中get方法和load方法的根本区别

    hibernate中get方法和load方法的根本区别 如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来 ...

  3. Hibernate Session get()vs load()的区别

    Hibernate Session get()vs load()的区别 Hibernate Session提供了从数据库中获取数据的不同方法.其中两个是 - get()和load().我们还可以在不同 ...

  4. Hibernate save, saveOrUpdate, persist, merge, update 区别

    Hibernate save, saveOrUpdate, persist, merge, update 区别 - 小黑客 - 博客园 https://www.cnblogs.com/xiaoheik ...

  5. hibernate中@Entity和@Table的区别

    Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库. 这些普通Java对象被称作Entity Bean. 除了是用Java Pers ...

  6. load 和 loads的区别

    学习的东西哦随着时间的推移也越来越多,知识是不断积累的,但是奈何好记性不如烂笔头,学过的东西也老是会忘, 今天在文件中读取数据入库的时候竟然忘了load 和 loads 的区别,分别都是用来干什么的用 ...

  7. dump、dumps、load、loads的区别

    在爬虫或者处理数据的时候经常会遇到json格式的字符串或者是json格式的文件,使用json包来处理相当方便. dump.dumps.load.loads的区别 dumps.loads区别 dumps ...

  8. 一口一口吃掉Hibernate(二)——别被世俗蒙蔽了双眼:Hibernate中Session之get和load方法的真正区别

    最近在学习SHH框架中的Hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深.所以百度了一下,结果问题来了.百度的结果和实际测试的结果出入 ...

  9. hibernate中load和get方法的区别 lazy的策略

    1  get不支持lazy   load支持lazy 2  采用get加载数据时,如果无匹配数据则返回null         load则报异常 --------------------------- ...

最新文章

  1. data的值 如何初始化vue_vue data恢复初始化数据的实现方法
  2. Oracle10gr2 开机自启动脚本
  3. 山寨SaaS--管理软件夜未眠(五)
  4. 精通 R plot—第1部分:颜色,图例和线
  5. Oracle学习 第26天 Toad试用感受
  6. 【MaxScript】删除所选择的骨骼的位置和缩放
  7. DevExpress v18.1新版亮点——WinForms篇(六)
  8. maven伺服搭建_Maven私服搭建
  9. cocos2d-x游戏引擎核心(3.x)----事件分发机制之事件从(android,ios,desktop)系统传到cocos2dx的过程浅析...
  10. 使用Mathcad解受迫振动微分方程并画图
  11. 花书《深度学习》代码实现:01 线性代数:基本概念+代码实现基本运算
  12. win10更新卡到57%怎么办
  13. react hooks子给父传值
  14. 哀悼日-全网变灰效果实现
  15. mro python_python MRO
  16. Cartopy绘图入门指南
  17. Python习题——2018-03-28作业
  18. 三角形的几何公式大全_2020高中数学必备公式大全
  19. NEW a Girl Friend
  20. 电脑蓝屏错误代码0x0000007e的解决方法

热门文章

  1. 【滤波】概率、高斯和贝叶斯
  2. 记录学习 - 分区函数Partition By的使用
  3. 安装出错:Command line option syntax error.Type Command /? for help.解决方案
  4. 这11家世界顶级AI初创公司,每个单拎出来都是行业第一
  5. vr虚拟现实展示是怎么实现的
  6. 抖音广告多少种,这些你知道吗?
  7. Trust App(高通)
  8. 太阳能电池基本特性实验报告_太阳能电池基本特性测定实验
  9. 机器视觉入门资料大全,工业机器人“眼睛”
  10. 林业调查规划资质全国林业单位办理认定标准和申请条件