Hibernate-ORM:04.Hibernate中的get()和load()

简介:     ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配置不做重复展示,见谅)   Hibernate中查询单个,...

 

 

 

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------

 

 

 

本篇博客会讲如何用get()或load()查询单个对象和对缓存的简单操作,以及他俩的区别和相同(前面有的那些配置不做重复展示,见谅)

 

Hibernate中查询单个,就是用get()或load()任意一个做操作即可!

我会讲明区别和相同的地方,再加上一些验证我说的区别和相同的实例:

 

一,查询单个

  1.使用get()查询单个

 

    @Test
    /*get他是直接加载*/
    public void t4GetDemo01(){
        System.out.println("----------------------------------");
        Teacher teacher = session.get(Teacher.class, 1);
        System.out.println("----------------------------------");
        System.out.println(teacher.getName());
    }

 

  2.使用load()查询单个

 

    @Test
    /*load他是懒加载*/
    public void t5LoadDemo01(){
        System.out.println("----------------------------------");
        Teacher teacher = session.load(Teacher.class, 1);
        System.out.println("----------------------------------");
        System.out.println(teacher.getName());
    }

 

 

 

二,相同处

  1.get()和load()都使用缓存,他们查找记录的策咯是,先找一级缓存,有就拿来用,没有再去找二级,二级还没有就找数据库

  (验证规则:同样的查俩次,看看发几次sql不就好了么!)

 

    /*get查记录从一级缓存开始找,一级没找到去二级找,二级没找到去数据库,数据库没找到返回null*/
    @Test
    /*测试get缓存1*/
    /*从他只发一条sql就知道他走的有缓存,因为二级缓存没有配置,所以,是一级缓存*/
    public void t6GetCacheDemo01(){
        System.out.println("----------------------------------");
        Teacher teacher1 = session.get(Teacher.class, 1);
        Teacher teacher2 = session.get(Teacher.class, 1);
        System.out.println("----------------------------------");
    }

 

  2.他俩使用基本相似,传的同样俩个参数,返回值也一样

 

三,区别

  1.get()是直接加载,load是懒加载(又称延迟加载)

  (验证:)

 

    /*get和load都是查询,区别:*/
    @Test
    /*get他是直接加载*/
    public void t4GetDemo01(){
        System.out.println("----------------------------------");
        Teacher teacher = session.get(Teacher.class, 1);
        System.out.println("----------------------------------");
        System.out.println(teacher.getName());
    }
    @Test
    /*load他是懒加载*/
    public void t5LoadDemo01(){
        System.out.println("----------------------------------");
        Teacher teacher = session.load(Teacher.class, 1);
        System.out.println("----------------------------------");
        System.out.println(teacher.getName());
    }
    /*测试在有懒加载的时候不使用它查不查数据*/
    public void t12LoadLazyTrueDemo02(){
        Teacher teacher = session.load(Teacher.class, 1);
        System.out.println("----------------------------------");
    }

 

  2.查询一个没有的记录get()返回的是null,load()则会引发异常ObjectNotFoundException

 

    @Test
    /*测试get获取一个没有的值*/
    public void t9GetHaventDemo01(){
        Teacher teacher = session.get(Teacher.class, 5);
        System.out.println("----------------------------------");
        System.out.println(teacher);
    }
    @Test
    /*测试load获取一个没有的值,会抛ObjectNotFoundException*/
    public void t10LoadHaventDemo01(){
        Teacher teacher = session.load(Teacher.class, 5);
        System.out.println("----------------------------------");
        System.out.println(teacher);
    }

 

 

四,操作一级缓存查看对get()和load()的影响清除单个缓存,和全部缓存

 

    @Test
    /*清除单个缓存*/
    public void t7GetCacheDemo02(){
        System.out.println("----------------------------------");
        Teacher teacher1 = session.get(Teacher.class, 1);
        Teacher teacher2 = session.get(Teacher.class, 2);
        System.out.println("----------------------------------");
        session.evict(teacher1);
        teacher1= session.get(Teacher.class, 1);
    }
    @Test
    /*清除全部缓存*/
    public void t8GetCacheDemo03(){
        System.out.println("----------------------------------");
        Teacher teacher1 = session.get(Teacher.class, 1);
        Teacher teacher2 = session.get(Teacher.class, 2);
        System.out.println("----------------------------------");
        session.clear();
        teacher1= session.get(Teacher.class, 1);
        teacher2 = session.get(Teacher.class, 2);
    }

 

  结论:get()和load()确实使用到了缓存,如果缓存被清除,他们就得再发sql到数据库去查

 

五,load()也可以直接加载

  方案:

  在**.hbm.xml小配置文件中,配置延迟加载lazy=false

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.dawn.day01.entity">
    <!--如果上面指定package的话,class的name就不必写全类名-->
    <!--lazy:是否懒加载(延迟加载)        默认值是true,延迟加载-->
    <!--<class name="Teacher">-->
    <!--直接加载-->
    <class name="Teacher" lazy="false">
        <!--主键-->
        <id name="id" column="tid">
            <!--主键生成策咯  assigned程序员自己创建-->
            <!--identity是mysql里的自增,一会做增加操作不必再给主键赋值-->
            <!--increment是先查最大的主键列,在下一条给主键加一-->
            <!--sequence是oracle的主键生成策咯,他一会需要指定序列名字<param name="sequence">序列名</param>-->
            <generator class="assigned"></generator>
        </id>
        <property name="name" column="name"></property>
    </class>
</hibernate-mapping>

 

  测试:

 

    @Test
    /*测试在没有懒加载的时候不使用它查不查数据*/
    public void t12LoadLazyTrueDemo02(){
        Teacher teacher = session.load(Teacher.class, 1);
        System.out.println("----------------------------------");
    }

 

 

 

 

作者:晨曦Dawn

转载请注明出处,博客地址https://www.cnblogs.com/DawnCHENXI/p/9090682.html

如果有错误,请指出,感激不尽!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

目录
相关文章
|
SQL Java 数据库连接
Hibernate中Session的load和get方法的区别是什么?
主要有以下三项区别: ① 如果没有找到符合条件的记录,get方法返回null,load方法抛出异常。 ② get方法直接返回实体类对象,load方法返回实体类对象的代理。
1076 0
|
XML SQL Java
Hibernate-ORM:14.Hibernate中的命名查询
      ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客讲述命名查询,所谓命名查询是什么呢? Hibernate中允许我们在xml,实体类,甚至注解的方式来编写查询语句,本篇博客将讲述xml中的方式 一,准备好准备工作,我由于上篇博客把大量的准备都做好,所以,本篇从简 二,预览hbm.
1041 0
|
SQL Java 数据库连接
Hibernate-ORM:15.Hibernate中的Criteria查询
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客讲师Hibernate中的Criteria查询! 一,Criteria简介:   刚接触Hibernate的时候,就有一个概念,全自动的ORM框架,不用写...
999 0
|
SQL 缓存 Java
Hibernate-ORM:16.Hibernate中的二级缓存Ehcache的配置
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客讲述Hibernate中的二级缓存的配置,作者将使用的是ehcache缓存 一,目录   1.
1235 0
|
Java 关系型数据库 程序员
Hibernate-ORM:13.Hibernate中的连接查询
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------     本篇博客将会解释Hibernate中的连接查询(各种join) 一,目录   1.
920 0
|
Java 关系型数据库 数据库连接
Hibernate-ORM:12.Hibernate中的多对多关联关系
    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客将讲述Hibernate中的多对多关联关系的操作,准备的篇幅较少,望海涵   一,讲述多对多   多对多的关联关系,比如学生和教师来说,一个学生由多个教师授课...
1255 0
|
安全
Hibernate-ORM:09.Hibernate中的getCurrentSession()
  ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客将讲述,以优雅的方式创建session对象,我将会说明优点,并提炼成工具类   优点:   1.
1274 0
|
Java 关系型数据库 MySQL
Hibernate-ORM:10.Hibernate中的分页
  ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客讲述Hibernate中的分页 hibernate中的分页其实很好写,它通过操作对象的方式,来进行分页查询操作 分页无非就是查俩个:1.
948 0
|
Java 关系型数据库 数据库连接
Hibernate-ORM:11.Hibernate中的关联查询
      ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------         本篇博客将讲述Hibernate中的关联查询,及其级联(cascade)操作,以及指定哪一方维护关联关系的(inverse)   一,讲述目录如下:   1.
1208 0
|
缓存 Java 数据库连接
Hibernate-ORM:06.Hibernate中三种状态
  ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------       本篇博客主要叙述Hibernate中的三种状态:临时状态(瞬时状态),持久状态,游离状态 commit和flush三种状态间的使用,commit和flush的区别: save...
1113 0