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); // 不存在的ID try {
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); // 不存在的ID Assert.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,所以这里得到的也是Proxy
Hibernate.initialize(user3); // 解开Proxy。但不会命中数据库 // 验证在load一个不存在的ID后。不解开然后get
User user4 = (User)session.load(User.class, 100L); // 不存在的ID。仍然将Proxy进入缓存
Assert.assertTrue(user4 instanceof HibernateProxy);
//Hibernate.initialize(user3); // 不解开Proxy
try {
session.get(User.class, 100L); // 得到Proxy,命中数据库尝试解开Proxy,因为ID不存在因此抛出异常
Assert.fail("ID不存在所以会出错。不会运行本条");
} catch (ObjectNotFoundException ex) { } // 清空缓存
session.clear(); // 验证缓存为空的情况下get是否为Proxy
User 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中load,get;find,iterator;merge,saveOrUpdate,lock的区别
hibernate中load,get;find,iterator;merge,saveOrUpdate,lock的区别 转自http://www.blogjava.net/bnlovebn/archi ...
- about hibernate lazy load and solution
about hibernate lazy load is that used when loaded again.it can increase efficienty and sava memory. ...
- Hibernate的load和get方法的区别
这次我们聊一下Hibernate3.2 Session加载数据时get和load方法的区别,我总结的如下: 1. 对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在sessi ...
- Hibernate 中 load() 和 get() 的区别
get 和 load 方式都是是根据 id 取得一个记录.下边详细说一下 get 和 load 的不同,因为有些时候为了对比也会把 find 加进来. 1.从返回结果上对比: load 方式检索不到的 ...
- hibernate中load和get方法的区别
1.读取时机不同(当lazy=true的时候) load是采用延迟机制(load语句不读库,等使用非主键时才去读库),而get不采用延 迟机制(get语句时马上读库): 2.搜索不到数据时的情 ...
- Hibernate 关于load和get方法区别
load和个体方法都可以充分利用内部缓存和二级缓存中的现有数据. ******************************************************************* ...
- Hibernate的load()和get()区别
最近在用Hibernate的时候发现一个问题:比如我们从数据库获得一个对象时,使用session.get()方法还是session.load()? 两种方法在获得一个实体对象时是有区别的,在查询性能 ...
- Hibernate 中 load() 方法导致的 noSession 异常
之所以要写这个,是因为最近碰到了一个延迟加载的 load() 导致出现 noSession 的异常. 下面第三种方式解决这个问题需要用到一个本地线程的对象,也就是 ThreadLocal 类,之前写过 ...
- Hibernate中load与get,update与merge方法的区别
1.load()与get()的区别: (1)load()读取 User user = (User)session.load(User.class, userId); (2)get()读取 User u ...
随机推荐
- Leetcode 488.祖玛游戏
祖玛游戏 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球. 每一次,你可以从手里的球选一个,然后把这个球插入到一串球中 ...
- Oracle 查看锁定对象 解锁
一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...
- Unity 碰撞检测
武器与怪物的碰撞 目前来说有三种思路,其实前两种算变种了: 1.动画关键帧回调 + 范围检测.http://blog.csdn.net/u013700908/article/details/52888 ...
- Spring MVC请求到处理方法注解配置的几种方式
@RequestMapping 这个是最常用的注解,可以配置在类上,也可以配置在方法上,两个一起作用组成方法能够响应的请求路径,举例如下 package org.zln.myWeb.controlle ...
- Java接口对Hadoop集群的操作
Java接口对Hadoop集群的操作 首先要有一个配置好的Hadoop集群 这里是我在SSM框架搭建的项目的测试类中实现的 一.windows下配置环境变量 下载文件并解压到C盘或者其他目录. 链接: ...
- log4j.xml配置文件详解
一 log4j.xml 配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:c ...
- py2exe error: [Errno 2] No such file or directory: 'MSVCP90.dll'
使用 python setup.py py2exe 打包时出现 py2exe error: [Errno 2] No such file or directory: 'MSVCP90.dll' 解决方 ...
- libc++abi.dylib`__cxa_throw: 使用[AVAudioPlayer play]会产生__cxa_throw异常
libc++abi.dylib`__cxa_throw: 使用[AVAudioPlayer play]会产生__cxa_throw异常 开发中遇到一个奇怪的异常.我调用AVAudioPlayer pl ...
- 洛谷 P1270 “访问”美术馆
P1270 “访问”美术馆 题目描述 经过数月的精心准备,Peer Brelstet,一个出了名的盗画者,准备开始他的下一个行动.艺术馆的结构,每条走廊要么分叉为两条走廊,要么通向一个展览室.Peer ...
- svn没有"对号"等符号
[问题描述]调整svn建立好了服务端.安装客户端也检出成功了.但是就是没有对号符号. [解决方案]右键菜单,设置,里面有“图标覆盖”这个选项,把你的文件夹加入进去,然后注销windows用户重新登陆