天天看點

Hibernate-ORM:04.Hibernate中的get()和load()一,查詢單個二,相同處:三,差別:

------------吾亦無他,唯手熟爾,謙卑若愚,好學若饑-------------

本篇部落格會講如何用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

如果有錯誤,請指出,感激不盡!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!