zoukankan      html  css  js  c++  java
  • hibernate get load difference

    http://blog.csdn.net/hlantian/article/details/5276597

    http://www.cnblogs.com/gxinliug/archive/2011/04/26/2029788.html

    hibernate 中 get、load 的 区别

    分类: 知识点 1999人阅读 评论(0) 收藏 举报

    转自:http://blog.163.com/love-love-l/blog/static/210783042009618919985/#comment=fks_083070085095080069081094083095086087081068092085086071

    从网上抄了两片。感觉不错,呵呵。

    第一篇

    这次我们来谈一下Hibernate3.2 Session加载数据时get和load方法的区别(Hibernate 3以后的版本就用get()方法取代find()这个方法了),其实这个在网上有很多的论述,可大多语焉不详或经不起实践的推敲,让很多初学者学的满腹疑窦,现在我给大家讲解一下:

    1. 对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本中get方法也会查找二级缓存!

    2. Hibernate load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:

    (1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。

    (2)若为false,就跟Hibernate get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。

    这里get和load有两个重要区别:

    如果未能发现符合条件的记录,Hibernate get方法返回null,而load方法会抛出一个ObjectNotFoundException。
    load 方法可返回没有加载实体数据的代理类实例,而get方法永远返回有实体数据的对象。(对于load和get方法返回类型:好多书中都说:“get方法永远只返回实体类”,实际上并不正确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。)
    总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

    最后,我们分析下为什么网路上那么多关于二者区别的文章不太准确!首先可能是版本问题,Hibernate版本不同,运行机制不太一样;其次就是很多朋友只是把自己经验所得与人分享,并没有经过全方位代码的检测;最后就是有些技术牛人,表达比较随意。所以我希望大家以后学习知识的时候不要盲从他人迷信权威,一定要综合多方资料,比较和整理,再经过自己实践检验,这样得到的知识才是真实有效的。

    第二篇

    1. Users user = (Users)session.load(Users. class , userId);    
    Users user = (Users)session.load(Users.class, userId);

    get加载方法:

    Java代码
    1. Users user = (Users)session.get(Users. class , userId);  
    Users user = (Users)session.get(Users.class, userId);

    两加载方法区别:

    区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate .ObjectNotFoundException;

    区别2:load支持延迟加载,get不支持延迟加载。

    也就是说:
    Java代码
    1. Users user = (Users)session.load(Users. class , userId);  
    Users user = (Users)session.load(Users.class, userId);

    这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。

    而:
    Java代码
    1. Users user = (Users)session.get(Users. class , userId);  
    Users user = (Users)session.get(Users.class, userId);

    则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。

    注意:
    Java代码
    1. Users user = (Users)session.load(Users. class , userId);  
    2. System.out.println(user.getId());  
    Users user = (Users)session.load(Users.class, userId); System.out.println(user.getId());

    上面这2句代码,不会去执行数据库操作。因为load后会在hibernate 的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。

    hibernate-get和load方法异同

  • 相关阅读:
    关于字段长度的定义
    连续滚动效果的脚本
    JavaScript显示日期,跳动时间,星期
    [转载]SQL2000里的数据类型
    VSTSTF54000错误
    Delphi TreeView 现场保存与恢复
    易简协同平台与佛道修行
    CMD 反编译CHM文件
    专家与大师
    流程建模思考(草)
  • 原文地址:https://www.cnblogs.com/lexus/p/2298817.html
Copyright © 2011-2022 走看看