/** * 測試級聯添加和加載策略 */public class AddCascadeTest { public static void main(String[] args) {// t1();//1.在Hibernate中實現添加Dept級聯添加Emp// t2();//2.在scott賬戶下級聯保存一個姓名為'李四',部門編號為"10"的員工// t3();//3.測試加載策略,默認為延遲加載。在session中查詢數據庫(session沒有關閉)// t4();//4.測試加載策略,默認為延遲加載。在session關閉后查詢數據庫(session已經關閉) t5();//5.測試加載策略,設為延遲加載。在session關閉后查詢數據庫(session已經關閉) }1、打開MyEclipse,創建一個新的java項目,命名為Hibernate_Oracle_AddCascade
2、打開oracle數據庫連接,并在MyEclipse中的DB Browser新建一個數據庫連接,名為scott

3、在java項目中,新建一個lib目錄,再選中java項目導入hibernate框架

查看生成的hibernate.cfg.xml文件

4、添加Hibernate框架后,反向生成映射類和映射文件

再次查看生成的hibernate.cfg.xml文件

5、選中Dept.hbm.xml和Dept.java文件,修改屬性類型


查看Dept.java文件和Dept.hbm.xml文件


6、在hibernate.cfg.xml添加打印sql語句

7.測試級聯添加和加載策略,這是主方法
/** * 測試級聯添加和加載策略 */public class AddCascadeTest { public static void main(String[] args) {// t1();//1.在Hibernate中實現添加Dept級聯添加Emp// t2();//2.在scott賬戶下級聯保存一個姓名為'李四',部門編號為"10"的員工// t3();//3.測試加載策略,默認為延遲加載。在session中查詢數據庫(session沒有關閉)// t4();//4.測試加載策略,默認為延遲加載。在session關閉后查詢數據庫(session已經關閉) t5();//5.測試加載策略,設為延遲加載。在session關閉后查詢數據庫(session已經關閉) }測試方法一: /** * 1.在Hibernate中如何實現添加Dept級聯添加Emp?<br/> * 分析<br/> * 建立從Dept到Emp的一對多關聯<br/> * 在<set>標簽中配置cascade屬性為all<br/> * 例:在scott賬戶下添加一個部門,并同時向部門中添加2個員工<br/> */ PRivate static void t1() { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //scott賬戶dept表下添加一個部門 Dept dept = new Dept(); dept.setDname("研發一部"); dept.setLoc("武漢軟件新城"); //給新添加的部門添加兩個新員工 //1.添加新員工張無忌,部門為研發一部 Emp newEmp1 = new Emp(); newEmp1.setEname("張無忌"); newEmp1.setDept(dept); //2.添加新員工張三豐,部門為研發一部 Emp newEmp2 = new Emp(); newEmp2.setEname("張三豐"); newEmp2.setDept(dept); //在部門表中級聯添加員工 dept.getEmps().add(newEmp1); dept.getEmps().add(newEmp2); //持久化保存 session.save(dept); transaction.commit(); session.close(); sessionFactory.close(); }運行結果:
查詢數據庫,結果如下:


這是因為在Dept.hbm.xml中沒有設置級聯操作,打開Dept.hbm.xml設置

再次運行,插入部門并級聯添加員工成功。

查詢數據庫,插入成功。


測試方法二:
/** * 2.在scott賬戶下級聯保存一個姓名為'李四光',部門編號為"10"的員工 */ private static void t2() { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //咋scott賬戶emp表下添加一個新員工,姓名為'李四光' Emp emp = new Emp(); emp.setEname("李四光"); //通過session獲取部門編號為10的部門 Dept dept = (Dept) session.get(Dept.class, 10); //將獲得的部門編號添加到新員工 emp.setDept(dept); //持久化保存 session.save(emp); transaction.commit(); session.close(); sessionFactory.close(); }運行結果:
查詢數據庫:

測試方法三:
/** * 3.測試加載策略<br/> * 默認為延遲加載。<br/> * 如果<class>元素的lazy屬性為true。表示采用延遲加載;<br/> * 如果lazy屬性為false,表示采用立即加載<br/> * * 此處測試在session沒有關閉時,查詢數據庫采用延遲加載的結果 */ private static void t3() { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //通過session獲取部門編號為10的部門 Dept dept = (Dept) session.get(Dept.class, 10); //打印部門編號為10的部門名稱,lazy true/false 類級別 System.out.println(dept.getDname()); /** * 查詢數據庫(session沒有關閉) */ //打印部門編號為10的emp表中的員工 for(Object o : dept.getEmps()){ Emp emp = (Emp) o; System.out.println(emp.getEname()+"/t/t"+emp.getDept().getDeptno()); } transaction.commit(); session.close(); sessionFactory.close(); }運行結果:
測試方法四:
/** * 4.測試加載策略<br/> * 默認為延遲加載。<br/> * 在session關閉后查詢數據庫(session已經關閉)<br/> * 如果<class>元素的lazy屬性為true。表示采用延遲加載;<br/> * 如果lazy屬性為false,表示采用立即加載<br/> * * 此處測試在session關閉時,查詢數據庫采用延遲加載的結果 */ private static void t4() { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //通過session獲取部門編號為10的部門 Dept dept = (Dept) session.get(Dept.class, 10); //打印部門編號為10的部門名稱,lazy true/false 類級別 System.out.println(dept.getDname()); transaction.commit(); session.close(); sessionFactory.close(); /** * 查詢數據庫(session已經關閉) */ //打印部門編號為10的emp表中的員工 for(Object o : dept.getEmps()){ Emp emp = (Emp) o; System.out.println(emp.getEname()+"/t/t"+emp.getDept().getDeptno()); } }運行出錯,在session關閉后,不能查詢oracle數據庫。

異常信息為no session or session was closaed.沒有session或session已關閉。
測試方法五:
/** * 5.測試加載策略<br/> * 默認為延遲加載。<br/> * 如果<class>元素的lazy屬性為true。表示采用延遲加載;<br/> * 如果lazy屬性為false,表示采用立即加載<br/> * * 此處測試在session關閉時,查詢數據庫采用'立即加載'的結果 */ private static void t5() { Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); //通過session獲取部門編號為10的部門 Dept dept = (Dept) session.get(Dept.class, 10); //打印部門編號為10的部門名稱,lazy true/false 類級別 System.out.println(dept.getDname()); transaction.commit(); session.close(); sessionFactory.close(); /** * 查詢數據庫(session已經關閉) */ //打印部門編號為10的emp表中的員工 for(Object o : dept.getEmps()){ Emp emp = (Emp) o; System.out.println(emp.getEname()+"/t/t"+emp.getDept().getDeptno()); } }在Dept.hbm.xml中的<set>標簽中添加lazy屬性,屬性值為false,采用立即加載策略。

運行測試方法五,結果如下:

可以看到,程序運行成功。說明立即加載策略在session關閉后依然能訪問數據庫。
最后在說一個,在“多對一”中lazy屬性的值為
<!-- 多對一many-to-one -->lazy屬性:no-proxy 無代理延遲加載 proxy延遲加載,默認為 proxy false立即加載-->

新聞熱點
疑難解答