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,find方法解析

    关于Hibernate的批量检索,批量更新和批量删除,所执行的操作并不尽遵循相同的规律.这一点使目前的Hibernate2.0还显得有些不够规格 化和强健.但以后的版本中,期望其可以突破这几个屏障. ...

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

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

  4. Hibernate之load和get的区别

    load和get都会可以起到从数据库中获取持久态数据的作用,但是还有些稍微的区别的. 参考下面的这个例子: @Test(expected = IllegalArgumentException.clas ...

  5. Hibernate中get方法和load方法的区别

    一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实 ...

  6. (9) hibernate加载持久化对象的两种方式——get、load

    一.get与load对比 在hibernate中get和load方法是根据id取得持久化对象的两种方法,但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更 ...

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

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

  8. Hibernate面试题经典汇总(二)

    Hibernate面试题经典汇总(二) 1.下面不属于持久化的是( a) A.把对象转换为字符串的形式通过网络传输,在另一端接收到这个字符串后能把 对象还原出来 B.把程序数据从数据库中读出来 C.从 ...

  9. 初识hibernate小案例

    使用hibernate前需要导入相关JAR包. 1.它可以接受词文法语言描述,并能产生识别这些语言的语句的程序 2.是一个Java的XML API,类似于jdom,用来读写XML文件的 3.支持注解配 ...

最新文章

  1. 宏BOOST_TEST_REF的用法程序
  2. oracle symonym_Oracle的同义词(synonyms)
  3. oracle erp 报表开发手册,处置OracleERP导出的报表文件
  4. 利用NCO 3.0 调用SAP中的函数
  5. java ftp详解_Java实现FTP文件上传详解
  6. 【转】Qt QTableview使用
  7. AC自动机(Aho-Corasick automation)(转)
  8. Kali Linux信息收集工具全集
  9. BeanNotOfRequiredTypeException,Bean named ‘xx‘ is excepted to be of type ‘xx‘ but was ‘$Proxy30 ‘
  10. Android Wi-Fi 设置wifi Only 11a、b、g、n 扫描(以QCOM为平台)
  11. manim动画部分目录
  12. python爬取裁判文书并分析_裁判文书网爬虫攻克
  13. VCF | 多等位基因位点如何拆分?InDel变异如何标准化?
  14. 中国 CA 市场 分析
  15. win10 强制进入bios页面
  16. 源于实践的ERP123——ERP123方法论(转)
  17. Debian10.1安装中文输入法与sogou搜狗输入法
  18. 《数文明》阅读笔记-无匿名的追踪:天网的隐喻
  19. 产品经理如何做好行业研究及竞争对手分析工作
  20. jar包执行命令脚本

热门文章

  1. linux中删除文件名称乱码
  2. 微软.NET程序员必上的网站
  3. 【elasticsearch】es一直重启,报错日志是分片无法分配
  4. 组件注册@ComponentScan的自动扫描和指定扫描规则
  5. 设计模式的七大设计原则:其五:开闭原则
  6. lucene域的各种类型
  7. JMETER badboy 录制脚本
  8. c++ 链表_链表(单向链表的建立、删除、插入、打印)
  9. linux的grub界面退出,linux退出 grub
  10. 学python入门需要什么基础?