隨筆-54  評論-0  文章-2  trackbacks-0

          徐老師已經把常見的異常在課堂上進行了演示,說實話,這兩天都有點郁悶啊,Hibernate咋挺難懂的,老師講的比較深,一天下來,晚上再看一遍老師的視頻,才基本上可以搞清楚課堂上不理解 的知識點。今天講的雙向關聯和檢索策略。

          1.雙向關聯

          1.一對多關聯關系

          屬性方式

          2.在昨天的custrom.java中,主要代碼:

                 private Set<Order> orders = new HashSet<Order>();

                

                 public Set<Order> getOrders() {

                        return orders;

                 }

                 public void setOrders(Set<Order> orders) {

                        this.orders = orders;

                 }

          3.Custromer.hbm.xml

          <class>中加上:

          <set name="orders" lazy="false" inverse="true">

                               <key column="cid" />

                               <one-to-many class="cn.itcast.hibernate.persistence.Order" />

                        </set>

           

          4.測試: 主要代碼:

          Customer c = new Customer();

                        c.setAge(12);

                       

                        Order o = new Order();

                        o.setOrderNumber("No003");

                        o.setPrice(500f);

                        //設置關聯關系

                        o.setCustomer(c);

                       

                        //s.save(c);

                        s.save(o);

           

          5.通過Hibernate 查詢客戶所有訂單

           

          s.get(Order.class,new Long(1));

          debug模式查看所有訂單信息

           

          注意:雙向關聯是兩端同時進 行

          2.操縱持久化對象:

          對緩存的理解:首先明白一點:

          顯式回收:

          當沒有任何一個對象引用或者指針指向他時,就回收

           

          1.當用session 增刪改查對象時,用seesion.flush()方法可以實現將數據插入數據庫,但不提交事務,。

            之后調用session.clear(),清空本地緩存

           

          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會保證不出現訪問對象圖的死循

               還,以及由死循環引起的JVM堆棧溢出異常。

          提示:

          session加載了customer對象后,會為customer對象的值類型的屬性復制一份快照。當清理

          緩存時,通過比較對象的當前屬性和快照,來判斷對象的那些屬性發生了變化。

           

          3.hibernatejava對象的狀態

          臨時狀態(transient):剛剛用new語句創建,沒有被持久化,不處于session中。該對象

          成為臨時對象

          持久化狀態(persistent):已經被持久化,加入到session的緩存中。該狀態的對象為持久

             化對象。

          游離狀態(detached):已經被持久化,但不處于session中。該狀態的對象為游離對象。

          注意:sessiondelete方法對于游離對象,該方法從數

                據庫中刪除記錄,對于持久化對象,該方法從數據

                庫中刪除記錄,還要刪除緩存中的對象。

             close方法使緩存被清空,緩存中的所有的

                對象都變為游離對象。

          游離對象處于內存中

          posted on 2010-01-31 23:32 d66380022 閱讀(136) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 镇江市| 金昌市| 佳木斯市| 利辛县| 邯郸县| 鄯善县| 余干县| 阿拉善右旗| 南川市| 赤城县| 太和县| 将乐县| 新干县| 汝阳县| 忻城县| 固镇县| 松江区| 沭阳县| 宽甸| 宜州市| 淄博市| 沽源县| 和政县| 阳西县| 齐齐哈尔市| 尼勒克县| 文山县| 肇东市| 隆安县| 泽库县| 洞头县| 扶沟县| 秦安县| 牡丹江市| 信宜市| 永川市| 洛南县| 吉木萨尔县| 辽宁省| 德惠市| 临猗县|