徐老師已經把常見的異常在課堂上進行了演示,說實話,這兩天都有點郁悶啊,Hibernate咋挺難懂的,老師講的比較深,一天下來,晚上再看一遍老師的視頻,才基本上可以搞清楚課堂上不理解 的知識點。今天講的雙向關聯和檢索策略。
1.雙向關聯
1.一對多關聯關系
屬性方式
2.在昨天的custrom.java中,主要代碼:
3.在Custromer.hbm.xml中
<class>中加上:
<set name="orders" lazy="false" inverse="true">
4.測試: 主要代碼:
Customer c = new Customer();
5.通過Hibernate 查詢客戶所有訂單
s.get(Order.class,new Long(1));
debug模式查看所有訂單信息
注意:雙向關聯是兩端同時進 行
2.操縱持久化對象:
對緩存的理解:首先明白一點:
顯式回收:
當沒有任何一個對象引用或者指針指向他時,就回收
1.當用session 增刪改查對象時,用seesion.flush()方法可以實現將數據插入數據庫,但不提交事務,。
2.commit()方法默認包含兩步操作:先清理緩 存,后提交
緩存里放的全是引用
s.flush();//清理緩存
s.refresh();
s.clear();//顯式清空
例如:
Customer c = new Customer(“TOM”,new HashSet());
session.save(c);
Long id = c.getId();
c = null;
Customer c2 = (Customer)session.load(Customer.class,id);
tx.commit();
session.close();
c2.getName(); //這時仍然可以得到name值
C2 = null;//之后如果再調用上面的語句,則不能得到name值
---------------------------------------------------------------------------------------------
緩存的作用:
1。減少訪問數據庫的頻率。
2。保證緩存中的對象與數據庫中的相關記錄保持同步。
3。當緩存中的持久化對象之間存在循環關聯關系時,Session會保證不出現訪問對象圖的死循
提示:
當session加載了customer對象后,會為customer對象的值類型的屬性復制一份快照。當清理
緩存時,通過比較對象的當前屬性和快照,來判斷對象的那些屬性發生了變化。
3.在hibernate中java對象的狀態
臨時狀態(transient):剛剛用new語句創建,沒有被持久化,不處于session中。該對象
成為臨時對象
持久化狀態(persistent):已經被持久化,加入到session的緩存中。該狀態的對象為持久
游離狀態(detached):已經被持久化,但不處于session中。該狀態的對象為游離對象。
注意:session的delete方法對于游離對象,該方法從數
游離對象處于內存中