一. 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 ,測試加載的過程