Hibernate之load和get的差别
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的差别相关推荐
- hibernate get() load() 区别
来源:互联网 1.hibernate中get方法和load方法的根本区别在于:如果你使用load方法,hibernate 认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用 ...
- Hibernate,get,load,find方法解析
关于Hibernate的批量检索,批量更新和批量删除,所执行的操作并不尽遵循相同的规律.这一点使目前的Hibernate2.0还显得有些不够规格 化和强健.但以后的版本中,期望其可以突破这几个屏障. ...
- hibernate中load和get方法的区别 lazy的策略
1 get不支持lazy load支持lazy 2 采用get加载数据时,如果无匹配数据则返回null load则报异常 --------------------------- ...
- Hibernate之load和get的区别
load和get都会可以起到从数据库中获取持久态数据的作用,但是还有些稍微的区别的. 参考下面的这个例子: @Test(expected = IllegalArgumentException.clas ...
- Hibernate中get方法和load方法的区别
一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实 ...
- (9) hibernate加载持久化对象的两种方式——get、load
一.get与load对比 在hibernate中get和load方法是根据id取得持久化对象的两种方法,但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更 ...
- hibernate中get方法和load方法的根本区别
hibernate中get方法和load方法的根本区别 如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来 ...
- Hibernate面试题经典汇总(二)
Hibernate面试题经典汇总(二) 1.下面不属于持久化的是( a) A.把对象转换为字符串的形式通过网络传输,在另一端接收到这个字符串后能把 对象还原出来 B.把程序数据从数据库中读出来 C.从 ...
- 初识hibernate小案例
使用hibernate前需要导入相关JAR包. 1.它可以接受词文法语言描述,并能产生识别这些语言的语句的程序 2.是一个Java的XML API,类似于jdom,用来读写XML文件的 3.支持注解配 ...
最新文章
- 宏BOOST_TEST_REF的用法程序
- oracle symonym_Oracle的同义词(synonyms)
- oracle erp 报表开发手册,处置OracleERP导出的报表文件
- 利用NCO 3.0 调用SAP中的函数
- java ftp详解_Java实现FTP文件上传详解
- 【转】Qt QTableview使用
- AC自动机(Aho-Corasick automation)(转)
- Kali Linux信息收集工具全集
- BeanNotOfRequiredTypeException,Bean named ‘xx‘ is excepted to be of type ‘xx‘ but was ‘$Proxy30 ‘
- Android Wi-Fi 设置wifi Only 11a、b、g、n 扫描(以QCOM为平台)
- manim动画部分目录
- python爬取裁判文书并分析_裁判文书网爬虫攻克
- VCF | 多等位基因位点如何拆分?InDel变异如何标准化?
- 中国 CA 市场 分析
- win10 强制进入bios页面
- 源于实践的ERP123——ERP123方法论(转)
- Debian10.1安装中文输入法与sogou搜狗输入法
- 《数文明》阅读笔记-无匿名的追踪:天网的隐喻
- 产品经理如何做好行业研究及竞争对手分析工作
- jar包执行命令脚本