亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Java 中關于 unsaved-value 的問題

2019-11-18 13:16:29
字體:
來源:轉載
供稿:網友

  unsaved-value是表示一個對象是新的還是舊的,假如unsaved-value=none 那么就是新的,就會被insert到數據庫中,假如unsaved-value=any 就是說明對象是從數據庫中load的,被update到數據庫中。
  
  我的問題是:unsaved-value是由我們來強制說明這個對象是新的還是舊的,那假如我把一個對象的unsaved-value設置為any,那我要new 一個對象,把他save到數據庫中,怎么做呢?我感覺這不是矛盾了嗎?主要是我們在寫配置文件的時候怎么能說一個對象就一定是new的還是load的?
  
  當你顯式的使用session.save()或者session.update()操作一個對象的時候,實際上是用不到unsaved-value的。某些情況下(父子表關聯保存),當你在程序中并沒有顯式的使用save或者update一個持久對象,那么Hibernate需要判定被操作的對象究竟是一個已經持久化過的持久對象,是一個尚未被持久化過的內存臨時對象。例如:
  
  代碼:
  Session session = ...;
  Transaction tx = ...;
  
  Parent parent = (Parent) session.load(Parent.class, id);
  
  Child child = new Child();
  child.setParent(parent);
  child.setName("sun");
  
  parent.addChild(child);
  s.update(parent);
  
  s.flush();
  tx.commit();
  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)
  
  例如下面的情況:
  
  代碼:
  Session session = ...;
  Transaction tx = ...;
  
  Parent parent = (Parent) session.load(Parent.class, id);
  Child child = (Child) session.load(Child.class, childId);
  
  child.setParent(parent);
  child.setName("sun");
  
  parent.addChild(child);
  s.update(parent);
  
  s.flush();
  tx.commit();
  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類的主鍵屬性中的。
  
  代碼:
  <class name="Child" table="child">
  <id column="id" name="id" type="integer" unsaved-value="null">
   <generator class="identity"/>
  </id>
  ...
  </class>
  
  假如主鍵屬性不是對象型,而是基本類型,如int/long/double/...,那么你需要指定一個數值型的unsaved-value,例如:
  
  代碼:
  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/..了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩高清区| 亚洲天堂一区二区三区| 久久久999国产| 亚洲欧美日韩在线高清直播| 91在线视频精品| 欧美与欧洲交xxxx免费观看| 亚洲黄色av女优在线观看| 91精品国产91久久久久久最新| 亚洲三级黄色在线观看| 成人激情视频在线| 亚洲欧洲一区二区三区在线观看| 欧美日韩精品在线视频| 91在线视频成人| 国产成+人+综合+亚洲欧美丁香花| 538国产精品一区二区免费视频| 97色伦亚洲国产| 国产xxx69麻豆国语对白| 亚洲精品久久久一区二区三区| 久久欧美在线电影| 98视频在线噜噜噜国产| 亚洲欧美视频在线| 色哟哟亚洲精品一区二区| 国内精品久久久久久久| 深夜福利亚洲导航| 久久久在线视频| 亚洲www永久成人夜色| 欧美性xxxx极品hd欧美风情| 欧美性极品xxxx娇小| 日韩美女免费观看| 欧美夜福利tv在线| 高清视频欧美一级| 日韩在线观看电影| 亚洲精品电影在线观看| 亚洲日本成人女熟在线观看| 久久人人爽人人爽人人片亚洲| 亚洲欧美变态国产另类| 久久久精品视频成人| 国产精品久久久久久久av大片| 日韩a**中文字幕| 日韩成人免费视频| 九九久久综合网站| 欧美性少妇18aaaa视频| 国产精品欧美一区二区| 亚洲国产高清高潮精品美女| 最好看的2019的中文字幕视频| 97碰碰碰免费色视频| 色777狠狠综合秋免鲁丝| 日韩高清电影好看的电视剧电影| 国产欧美精品在线| 午夜精品国产精品大乳美女| 狠狠爱在线视频一区| 91精品综合久久久久久五月天| 欧美大尺度电影在线观看| 北条麻妃一区二区在线观看| 伊人久久精品视频| 国产精品69精品一区二区三区| 国产精品扒开腿爽爽爽视频| 国产成人jvid在线播放| 国产精品久久久久影院日本| 亚洲国产私拍精品国模在线观看| 欧美性20hd另类| 97精品久久久中文字幕免费| 久久香蕉频线观| 欧美精品福利视频| 亚洲精品久久久久久久久久久| 久久福利视频网| 欧美高清激情视频| 欧美电影在线免费观看网站| 国产精品jizz在线观看麻豆| 免费97视频在线精品国自产拍| xxx欧美精品| 久久久女人电视剧免费播放下载| 在线观看欧美视频| 国产精品美女无圣光视频| 日韩一二三在线视频播| 亚洲欧美在线第一页| 色悠悠久久久久| 久久伊人91精品综合网站| 亚洲激情免费观看| 91精品国产99| 精品久久久香蕉免费精品视频| 日韩黄色在线免费观看| 国产999视频| 欧美成人手机在线| 91精品国产91久久久久久久久| 5278欧美一区二区三区| 亚洲欧美中文字幕| 国产一区二区三区视频免费| 国产在线精品一区免费香蕉| 九色精品美女在线| 中文字幕不卡av| 国产欧美精品在线| 久久99热精品这里久久精品| 久久天堂电影网| 91九色在线视频| 九九精品视频在线| 欧美丰满老妇厨房牲生活| 精品香蕉在线观看视频一| 91久久国产综合久久91精品网站| 国产精品高潮粉嫩av| 欧美区在线播放| 国产精品高潮呻吟视频| 亚洲精品网址在线观看| 日韩最新av在线| 欧美成人免费大片| 九九精品在线视频| 日本精品久久久久久久| 热门国产精品亚洲第一区在线| 亚洲精品成a人在线观看| 欧美中文字幕在线| 成人激情av在线| 日韩动漫免费观看电视剧高清| 免费不卡欧美自拍视频| 福利一区视频在线观看| 北条麻妃一区二区三区中文字幕| 国产精品色视频| 欧美午夜精品久久久久久浪潮| 久久亚洲综合国产精品99麻豆精品福利| 亚洲香蕉成视频在线观看| 日韩成人黄色av| 亚洲午夜国产成人av电影男同| 青草青草久热精品视频在线观看| 中文字幕亚洲一区| 91九色单男在线观看| 欲色天天网综合久久| 日韩中文视频免费在线观看| 久久天天躁狠狠躁夜夜躁| 尤物tv国产一区| 国产精品久久久久久久久久久久久久| 91久久夜色精品国产网站| 狠狠干狠狠久久| 91精品国产乱码久久久久久久久| 欧洲s码亚洲m码精品一区| 欧美—级高清免费播放| 亚洲欧美中文日韩在线v日本| 国产精品影片在线观看| 国产精品最新在线观看| 精品高清一区二区三区| 97在线精品国自产拍中文| 精品国产31久久久久久| 色妞色视频一区二区三区四区| 久久久亚洲国产| 亚洲欧美日韩另类| 岛国av一区二区三区| 亚洲欧美在线免费观看| 91久久在线观看| 亚洲美女激情视频| 91九色国产视频| 久久天天躁狠狠躁夜夜av| 久久久久一本一区二区青青蜜月| 欧美孕妇孕交黑巨大网站| 国产精品一区二区三区久久| 97视频在线观看免费| 成人免费激情视频| 欧美极品少妇xxxxⅹ免费视频| 亚洲iv一区二区三区| 一区二区三区无码高清视频| 国产精品久久久久久久久免费看| 伦理中文字幕亚洲| 国产精品99蜜臀久久不卡二区| www.日韩.com| 亚洲美女激情视频| 国产视频丨精品|在线观看| 精品自拍视频在线观看|