隨筆 - 37  文章 - 14  trackbacks - 0
          <2007年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          文章分類

          相關鏈接

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          unsave-value:用來控制是save還是update對象。
          當你顯式的使用session.save()或者session.update()操作一個對象的時候,實際上是用不到unsaved-value的。某些情況下(父子表關聯(lián)保存),當你在程序中并沒有顯式的使用save或者update一個持久對象,那么Hibernate需要判斷被操作的對象究竟是一個已經(jīng)持久化過的持久對象,是一個尚未被持久化過的內(nèi)存臨時對象。例如:

           1Session session = ;   
           2Transaction tx = ;   
           3  
           4Parent parent = (Parent) session.load(Parent.class, id);   
           5  
           6Child child = new Child();   
           7child.setParent(parent);   
           8child.setName("sun");   
           9  
          10parent.addChild(child);   
          11s.update(parent);   
          12  
          13s.flush();   
          14tx.commit();   
          15s.close();  

          在上例中,程序并沒有顯式的session.save(child); 那么Hibernate需要知道child究竟是一個臨時對象,還是已經(jīng)在數(shù)據(jù)庫中有的持久對象。如果child是一個新創(chuàng)建的臨時對象(本例中就是這種情況),那么Hibernate應該自動產(chǎn)生session.save(child)這樣的操作,如果child是已經(jīng)在數(shù)據(jù)庫中有的持久對象,那么Hibernate應該自動產(chǎn)生session.update(child)這樣的操作。

          因此我們需要暗示一下Hibernate,究竟child對象應該對它自動save還是update。在上例中,顯然我們應該暗示Hibernate對child自動save,而不是自動update。那么Hibernate如何判斷究竟對child是save還是update呢?它會取一下child的主鍵屬性 child.getId() ,這里假設id是 java.lang.Integer類型的。如果取到的Id值和hbm映射文件中指定的unsave-value相等,那么Hibernate認為child是新的內(nèi)存臨時對象,發(fā)送save,如果不相等,那么Hibernate認為child是已經(jīng)持久過的對象,發(fā)送update。

          unsaved-value="null" (默認情況,適用于大多數(shù)對象類型主鍵 Integer/Long/String/...)

          當Hibernate取一下child的Id,取出來的是null(在上例中肯定取出來的是null),和unsaved-value設定值相等,發(fā)送save(child)

          當Hibernate取一下child的id,取出來的不是null,那么和unsaved-value設定值不相等,發(fā)送update(child)

          例如下面的情況:

           1Session session = ;   
           2Transaction tx = ;   
           3  
           4Parent parent = (Parent) session.load(Parent.class, id);   
           5Child child = (Child) session.load(Child.class, childId);   
           6  
           7child.setParent(parent);   
           8child.setName("sun");   
           9  
          10parent.addChild(child);   
          11s.update(parent);   
          12  
          13s.flush();   
          14tx.commit();   
          15s.close();  

          child已經(jīng)在數(shù)據(jù)庫中有了,是一個持久化的對象,不是新創(chuàng)建的,因此我們希望Hibernate發(fā)送update(child),在該例中,Hibernate取一下child.getId(),和unsave-value指定的null比對一下,發(fā)現(xiàn)不相等,那么發(fā)送update(child)。

          parent對象不需要操心,因為程序顯式的對parent有l(wèi)oad操作和update的操作,不需要Hibernate自己來判斷究竟是save還是update了。我們要注意的只是child對象的操作。另外unsaved-value是定義在Child類的主鍵屬性中的。


           
          1<class name="Child" table="child">  
          2<id column="id" name="id" type="integer" unsaved-value="null">  
          3  <generator class="identity"/>  
          4</id>  
          5   
          6</class>  
          7

          如果主鍵屬性不是對象型,而是基本類型,如int/long/double/...,那么你需要指定一個數(shù)值型的unsaved-value,例如:
          1unsaved-value="0"

          很多人以為對主鍵屬性定義為int/long,比定義為Integer/Long運行效率來得高,認為基本類型不需要進行對象的封裝和解構操作,因此喜歡把主鍵定義為int/long的。但實際上,Hibernate內(nèi)部總是把主鍵轉換為對象型進行操作的,就算你定義為int/long型的,Hibernate內(nèi)部也要進行一次對象構造操作,返回給你的時候,還要進行解構操作,效率可能反而低也說不定。因此大家一定要扭轉一個觀點,在Hibernate中,主鍵屬性定義為基本類型,并不能夠比定義為對象型效率來的高,而且也多了很多麻煩,因此建議大家使用對象型的Integer/Long定義主鍵.

          摘自javaeye
          posted on 2007-06-04 09:44 扭曲的鉛筆 閱讀(715) 評論(0)  編輯  收藏 所屬分類: Hibernate

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 清苑县| 兴宁市| 共和县| 思茅市| 濉溪县| 门头沟区| 安乡县| 贵定县| 六枝特区| 油尖旺区| 英吉沙县| 南木林县| 曲松县| 德兴市| 如东县| 法库县| 临夏市| 铜川市| 阜宁县| 康马县| 修水县| 富川| 福清市| 大邑县| 嘉义县| 青海省| 邯郸县| 肥城市| 昭苏县| 博湖县| 扎兰屯市| 象州县| 永川市| 商丘市| 桂平市| 潼南县| 芦溪县| 庄河市| 万年县| 黔西| 丹巴县|