<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    thinking

    one platform thousands thinking

    unsaved-value

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

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


    在上例中,程序并沒有顯式的session.save(child); 那么Hibernate需要知道child究竟是一個臨時對象,還是已經在數據庫中有的持久對象。如果child是一個新創建的臨時對象(本例中就是這種 情況),那么Hibernate應該自動產生session.save(child)這樣的操作,如果child是已經在數據庫中有的持久對象,那么 Hibernate應該自動產生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是新的內存臨時對象,發送save,如果不相等,那么Hibernate認為child是已經持久過的對象,發送update。

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

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

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

    例如下面的情況:

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


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

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

    Java代碼
    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>  


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

    Java代碼
    1. unsaved-null="0"  


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

    unsaved-value="none"和
    unsaved-value="any"

    主主要用在主鍵屬性不是通過Hibernate生成,而是程序自己setId()的時候。

    在這里多說一句,強烈建議使用Hibernate的id generator,或者你可以自己擴展Hibernate的id generator,特別注意不要使用有實際含義的字段當做主鍵來用!例如用戶類User,很多人喜歡用用戶登陸名稱做為主鍵,這是一個很不好的習慣,當 用戶類和其他實體類有關聯關系的時候,萬一你需要修改用戶登陸名稱,一改就需要改好幾張表中的數據。偶合性太高,而如果你使用無業務意義的id generator,那么修改用戶名稱,就只修改user表就行了。

    由這個問題引申出來,如果你嚴格按照這個原則來設計數據庫,那么你基本上是用不到手工來setId()的,你用Hibernate的id generator就OK了。因此你也不需要了解當

    unsaved-value="none"和
    unsaved-value="any"

    究竟有什么含義了。如果你非要用assigned不可,那么繼續解釋一下:

    unsaved-value="none" 的時候,由于不論主鍵屬性為任何值,都不可能為none,因此Hibernate總是對child對象發送update(child)

    unsaved-value="any" 的時候,由于不論主鍵屬性為任何值,都肯定為any,因此Hibernate總是對child對象發送save(child)

    大多數情況下,你可以避免使用assigned,只有當你使用復合主鍵的時候不得不手工setId(),這時候需要你自己考慮究竟怎么設置unsaved-value了,根據你自己的需要來定。

    BTW: Gavin King強烈不建議使用composite-id,強烈建議使用UserType。

    因此,如果你在系統設計的時候,遵循如下原則:

    1、使用Hibernate的id generator來生成無業務意義的主鍵,不使用有業務含義的字段做主鍵,不使用assigned。

    2、使用對象類型(String/Integer/Long/...)來做主鍵,而不使用基礎類型(int/long/...)做主鍵

    3、不使用composite-id來處理復合主鍵的情況,而使用UserType來處理該種情況。


    那么你永遠用的是unsaved-value="null" ,不可能用到any/none/..了。

    posted on 2009-07-10 17:38 lau 閱讀(176) 評論(0)  編輯  收藏 所屬分類: Hibernate


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


    網站導航:
     
    主站蜘蛛池模板: 37pao成人国产永久免费视频 | 最近中文字幕mv手机免费高清| 亚洲国产精品无码久久SM| 日韩在线观看免费| 免费一看一级毛片人| 免费无码又爽又黄又刺激网站| 亚洲国产小视频精品久久久三级| 国产亚洲精品美女久久久久 | 成年在线观看网站免费| 亚洲另类春色国产精品| 毛片免费全部免费观看| 香港一级毛片免费看| 国产AV无码专区亚洲AWWW| 中文字幕免费不卡二区 | 亚洲kkk4444在线观看| 香蕉高清免费永久在线视频| 相泽南亚洲一区二区在线播放| 男人的天堂亚洲一区二区三区 | 女人裸身j部免费视频无遮挡| 中文字幕亚洲综合久久菠萝蜜| a级毛片免费完整视频| 亚洲综合久久1区2区3区| 日本高清免费不卡视频| 一二三四在线观看免费中文在线观看| 在线a亚洲v天堂网2019无码| 色猫咪免费人成网站在线观看| 亚洲an日韩专区在线| 亚洲片国产一区一级在线观看| 免费在线观看一级片| 亚洲五月综合缴情婷婷| 亚洲精品高清在线| 久久久久久AV无码免费网站下载| 亚洲啪啪免费视频| 在线观看亚洲精品国产| 免费h片在线观看网址最新| 99亚洲精品卡2卡三卡4卡2卡| 亚洲AV永久纯肉无码精品动漫| 成人性生交大片免费看无遮挡| 亚欧乱色国产精品免费视频| 亚洲免费观看网站| 综合亚洲伊人午夜网 |