Hibernate之load和get的区别

来源:互联网 发布:淘宝怎么做汽车配件 编辑:程序博客网 时间:2024/05/09 13:45

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不一样,他直接去数据库中取,他得到的是对象本身,如果得不到的话就会返回空值。


再看一个例子:

@Testpublic 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的时候得到的是一个实体对象。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚出生的婴儿不会吸奶怎么办 生完小孩七十天妈妈咳嗽怎么办 带欣的名字三个字儿的怎么办 二十多岁的儿子沉迷游戏网络怎么办 为什么打开游戏网络却用不了怎么办 打来微信网页版显示证书错误怎么办 开了家定制家具店生意不好怎么办 宝宝起风疹怎么办要注意的问题 超市买的内裤西铁牌子没去掉怎么办 没申请生产许可证贴标了怎么办 淘宝没有品牌非要我写品牌怎么办没 意外怀孕明明一直用安全套的怎么办 找不到百度网盘的dns地址怎么办 小米众筹到了发货时间不发货怎么办 不知道电脑宽带连接账号密码怎么办 电脑如果宽带账号密码忘记了怎么办 xp电脑用户名和密码忘了怎么办 电脑的用户名和密码忘记了怎么办 电脑重置后需要用户名和密码怎么办 电脑登录用户名和密码忘记了怎么办 电脑登录用户名和密码忘了怎么办啊 微信无意中点了允许登录怎么办 qq号码登录微信无法验证怎么办 注册微信公众号邮箱激活不了怎么办 不是自己申请的qq号忘密码怎么办 联通宽带拨号账号密码忘记了怎么办 忘了路由器的用户名和密码怎么办 宽带连接用户名和密码忘了怎么办 江西银行网银用户名忘记了怎么办 江西银行网银密码忘了怎么办 广发信用卡网银密码忘了怎么办 刚注册的淘宝账号买不了东西怎么办 隐藏后的wif不知道用户名怎么办 脊柱侧弯术后钢钉断了一根怎么办 对法院执行裁定申请复议过期怎么办 自己家店名被别人注册了商标怎么办 有人去工商局投诉我公司了怎么办 急用钱怎么办啊有没有什么贷款啊 初级会计报名信息表没打印怎么办 电工证复审流程时间过了怎么办 应版权方要求无法下载的电影怎么办