Hibernate中使用load和get加載的區別


 一. Hibernate使用load機制和使用get加載的區別(重點)

   1.相同點:get 和load他們都可以通過指定的實體類與ID從數據庫中讀取數據,並返回對應的實例

   2. 不同點:如果找不到符合條件的紀錄,get()方法將返回null.而load()將會報出ObjectNotFoundEcception.

    2.1get 是直接從數據庫中檢索   而load會使用懶加載(延遲加載)產生一個代理對象,屬性oid

    2.2 使用load加載,Hibernate會認為該id對應的對象是一定存在的,所以它可以放心的使用,它可以放心的使用代理來 延遲加載該對象。在用到對象中的其他屬性數據時才查詢數據庫,但是萬一數據庫中不存在該記錄,那沒辦法,只能拋異常。

    2.3 使用get加載,hibernate會確認一下該id對應的數據是否存在,首先在session緩存中查找,然后在二級緩存中查找,還沒有就查數據庫,數據庫中沒有就返回null。

    3.測試代碼如下:

      3.1創建Hibernate的主配置文件:

  

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
    <!-- 配置sessionFactory,表示獲取連接,包含連接的四要素 
        注:hibernate 連接的四要素中的名字不能更改,必須是以下的名字
    -->
<session-factory>
    <!--方言   告訴hibernate,連接的是oracle數據庫     -->
    <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
    <property name="connection.url">jdbc:oracle:thin:local:1521:orcl</property>
    <property name="connection.username">scott</property>
    <property name="connection.password">tiger</property>
    <property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
    <!-- 此標簽用於是否在控制台輸出sql語句  此處ture表示輸出 -->
    <property name="show_sql">true</property>
    <!--此標簽表示引入hiberante的映射文件 -->
    <mapping resource="cn/et/hibernate/lesson02/query/Emp.hbm.xml" />
</session-factory>

</hibernate-configuration>

  3.2 創建hibernate的隱射文件Emp.hbm.xml

  

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="cn.et.hibernate.lesson01.Emp" table="EMP" schema="SCOTT">
        <id name="empno" type="java.lang.Short">
            <column name="EMPNO"/>
            <generator class="native" />
        </id>
        <property name="ename" type="java.lang.String">
            <column name="ENAME">
                <comment>員工姓名</comment>
            </column>
        </property>
        <property name="job" type="java.lang.String">
            <column name="JOB">
                <comment>員工職位</comment>
            </column>
        </property>
        <property name="mgr" type="java.lang.Short">
            <column name="MGR">
                <comment>領導編號</comment>
            </column>
        </property>
        <property name="hiredate" type="java.util.Date">
            <column name="HIREDATE">
                <comment>雇佣日期</comment>
            </column>
        </property>
        <property name="sal" type="java.lang.Double">
            <column name="SAL">
                <comment>月薪</comment>
            </column>
        </property>
        <property name="comm" type="java.lang.Double">
            <column name="COMM">
                <comment>獎金</comment>
            </column>
        </property>
        <property name="deptno" type="java.lang.Short">
            <column name="DEPTNO">
                <comment>所屬部門編號</comment>
            </column>
        </property>
    </class>
</hibernate-mapping>

  3.3創建Emp表的實體類

  

package cn.et.hibernate.lesson02.query;

import java.util.Date;

/**
 * Emp entity. @author MyEclipse Persistence Tools
 */

public class Emp implements java.io.Serializable {

    // Fields

    private Short empno;
    private String ename;
    private String job;
    private Short mgr;
    private Date hiredate;
    private Double sal;
    private Double comm;
    private Short deptno;

    // Constructors

    /** default constructor */
    public Emp() {
    }

    /** full constructor */
    public Emp(String ename, String job, Short mgr, Date hiredate, Double sal,
            Double comm, Short deptno) {
        this.ename = ename;
        this.job = job;
        this.mgr = mgr;
        this.hiredate = hiredate;
        this.sal = sal;
        this.comm = comm;
        this.deptno = deptno;
    }

    // Property accessors

    public Short getEmpno() {
        return this.empno;
    }

    public void setEmpno(Short empno) {
        this.empno = empno;
    }

    public String getEname() {
        return this.ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return this.job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Short getMgr() {
        return this.mgr;
    }

    public void setMgr(Short mgr) {
        this.mgr = mgr;
    }

    public Date getHiredate() {
        return this.hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public Double getSal() {
        return this.sal;
    }

    public void setSal(Double sal) {
        this.sal = sal;
    }

    public Double getComm() {
        return this.comm;
    }

    public void setComm(Double comm) {
        this.comm = comm;
    }

    public Short getDeptno() {
        return this.deptno;
    }

    public void setDeptno(Short deptno) {
        this.deptno = deptno;
    }

}

  3.4 創建測試類代碼:

  

package cn.et.hibernate.lesson02.query;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class TestHibernate {
    //表示增加
    @Test
    public void test1(){
        //創建sessionFactory
        SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson02/hibernate.cfg.xml").buildSessionFactory();
        Session session = sf.openSession();
        //開啟一個事物
        Transaction  t = session.beginTransaction();
        Emp emp = (Emp)session.load(Emp.class,Short.parseShort("7369"));
        t.commit();
    }
}
//上述代碼可用dubug模式進行調試,加載load 和get ,測試加載的過程

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM