eg. Person person = new Person("xxx", "xx");
濡傛灉娌℃湁鍙橀噺瀵硅瀵硅薄榪涜寮曠敤錛屽畠灝嗚java铏氭嫙鏈哄洖鏀躲?/p>
鐬椂瀵硅薄鍦ㄥ唴瀛樺绔嬪瓨鍦紝瀹冩槸鎼哄甫淇℃伅鐨勮澆浣擄紝涓嶅拰鏁版嵁搴撶殑鏁版嵁鏈変換浣曞叧鑱斿叧緋伙紝鍦℉ibernate涓紝鍙氳繃session鐨剆ave()鎴杝aveOrUpdate()鏂規硶灝嗙灛鏃跺璞′笌鏁版嵁搴撶浉鍏寵仈錛屽茍灝嗘暟鎹搴旂殑鎻掑叆鏁版嵁搴撲腑錛屾鏃惰鐬椂瀵硅薄杞彉鎴愭寔涔呭寲瀵硅薄銆?/p>
鎸佷箙鎬?
澶勪簬璇ョ姸鎬佺殑瀵硅薄鍦ㄦ暟鎹簱涓叿鏈夊搴旂殑璁板綍錛屽茍鎷ユ湁涓涓寔涔呭寲鏍囪瘑銆傚鏋滄槸鐢╤ibernate鐨刣elete()鏂規硶錛屽搴旂殑鎸佷箙瀵硅薄灝卞彉鎴愮灛鏃跺璞★紝鍥犳暟鎹簱涓殑瀵瑰簲鏁版嵁宸茶鍒犻櫎錛岃瀵硅薄涓嶅啀涓庢暟鎹簱鐨勮褰曞叧鑱斻?/p>
褰撲竴涓猻ession鎵цclose()鎴朿lear()銆乪vict()涔嬪悗錛屾寔涔呭璞″彉鎴愯劚綆″璞★紝姝ゆ椂鎸佷箙瀵硅薄浼氬彉鎴愯劚綆″璞★紝姝ゆ椂璇ュ璞¤櫧鐒跺叿鏈夋暟鎹簱璇嗗埆鍊鹼紝浣嗗畠宸蹭笉鍦℉Ibernate鎸佷箙灞傜殑綆$悊涔嬩笅銆?/p>
鎸佷箙瀵硅薄鍏鋒湁濡備笅鐗圭偣錛?/p>
1. 鍜宻ession瀹炰緥鍏寵仈錛?/p>
2. 鍦ㄦ暟鎹簱涓湁涓庝箣鍏寵仈鐨勮褰曘?/p>
鑴辯鎬?
褰撲笌鏌愭寔涔呭璞″叧鑱旂殑session琚叧闂悗錛岃鎸佷箙瀵硅薄杞彉涓鴻劚綆″璞°傚綋鑴辯瀵硅薄琚噸鏂板叧鑱斿埌session涓婃椂錛屽茍鍐嶆杞彉鎴愭寔涔呭璞°?/p>
鑴辯瀵硅薄鎷ユ湁鏁版嵁搴撶殑璇嗗埆鍊鹼紝鍙氳繃update()銆乻aveOrUpdate()絳夋柟娉曪紝杞彉鎴愭寔涔呭璞°?/p>
鑴辯瀵硅薄鍏鋒湁濡備笅鐗圭偣錛?/p>
1. 鏈川涓婁笌鐬椂瀵硅薄鐩稿悓錛屽湪娌℃湁浠諱綍鍙橀噺寮曠敤瀹冩椂錛孞VM浼氬湪閫傚綋鐨勬椂鍊欏皢瀹冨洖鏀訛紱
2. 姣旂灛鏃跺璞″浜嗕竴涓暟鎹簱璁板綍鏍囪瘑鍊箋?/p>
hibernate鐨勫悇縐嶄繚瀛樻柟寮忕殑鍖?save,persist,update,saveOrUpdte,merge,flush,lock)鍙?瀵硅薄鐨勪笁縐嶇姸鎬?br />
hibernate鐨勪繚瀛?br />
hibernate瀵逛簬瀵硅薄鐨勪繚瀛樻彁渚涗簡澶鐨勬柟娉曪紝浠栦滑涔嬮棿鏈夊緢澶氫笉鍚岋紝榪欓噷緇嗚涓涓嬶紝浠ヤ究鍖哄埆銆?br />
涓銆侀澶囩煡璇?br />
瀵逛簬hibernate錛屽畠鐨勫璞℃湁涓夌鐘舵侊紝transient銆乸ersistent銆乨etached
涓嬭竟鏄父瑙佺殑緲昏瘧鍔炴硶錛?br />
transient錛氱灛鎬佹垨鑰呰嚜鐢辨?br />
(new DeptPo(1,”琛屾斂閮?#8221;,20,”琛屾斂鐩稿叧”)錛岃po鐨勫疄渚嬪拰session娌℃湁鍏寵仈錛岃po鐨勫疄渚嬪浜巘ransient)
persistent錛氭寔涔呭寲鐘舵?br />
(鍜屾暟鎹簱涓褰曟兂褰卞皠鐨凱o瀹炰緥錛屽畠鐨勭姸鎬佹槸persistent, 閫氳繃get鍜宭oad絳夊緱鍒扮殑瀵硅薄閮芥槸persistent)
detached錛氳劚綆$姸鎬佹垨鑰呮父紱繪?br />
(1)褰撻氳繃get鎴杔oad鏂規硶寰楀埌鐨刾o瀵硅薄瀹冧滑閮藉浜巔ersistent,浣嗗鏋滄墽琛宒elete(po)鏃?浣嗕笉鑳芥墽琛屼簨鍔?,璇o鐘舵佸氨澶勪簬detached, (琛ㄧず鍜宻ession鑴辯鍏寵仈),鍥燿elete鑰屽彉鎴愭父紱繪佸彲浠ラ氳繃save鎴杝aveOrUpdate()鍙樻垚鎸佷箙鎬?br />
(2)褰撴妸session鍏抽棴鏃訛紝session緙撳瓨涓殑persistent鐨刾o瀵硅薄涔熷彉鎴恉etached
鍥犲叧闂璼ession鑰屽彉鎴愭父紱繪佺殑鍙互閫氳繃lock銆乻ave銆乽pdate鍙樻垚鎸佷箙鎬?br />
鎸佷箙鎬佸疄渚嬪彲浠ラ氳繃璋冪敤 delete()鍙樻垚鑴辯鐘舵併?br />
閫氳繃get()鎴杔oad()鏂規硶寰楀埌鐨勫疄渚嬮兘鏄寔涔呭寲鐘舵佺殑銆?br />
鑴辯鐘舵佺殑瀹炰緥鍙互閫氳繃璋冪敤lock()鎴栬卹eplicate()榪涜鎸佷箙鍖栥?/p>
save()鍜宲ersist()灝嗕細寮曞彂SQL鐨処NSERT錛宒elete()浼氬紩鍙慡QLDELETE錛?br />
鑰寀pdate()鎴杕erge()浼氬紩鍙慡QL UPDATE銆傚鎸佷箙鍖栵紙persistent錛夊疄渚嬬殑淇敼鍦ㄥ埛鏂版彁浜ょ殑鏃跺欎細琚嫻嬪埌錛屽畠涔熶細寮曡搗SQL UPDATE銆?br />
saveOrUpdate()鎴栬卹eplicate()浼氬紩鍙慡QLINSERT鎴栬匲PDATE
浜屻乻ave 鍜寀pdate鍖哄埆
鎶婅繖涓瀵規斁鍦ㄧ涓浣嶇殑鍘熷洜鏄洜涓鴻繖涓瀵規槸鏈甯哥敤鐨勩?br />
save鐨勪綔鐢ㄦ槸鎶婁竴涓柊鐨勫璞′繚瀛?br />
update鏄妸涓涓劚綆$姸鎬佺殑瀵硅薄鎴栬嚜鐢辨佸璞★紙涓瀹氳鍜屼竴涓褰曞搴旓級鏇存柊鍒版暟鎹簱
涓夈乽pdate 鍜宻aveOrUpdate鍖哄埆
榪欎釜鏄瘮杈冨ソ鐞嗚В鐨勶紝欏懼悕鎬濅箟錛宻aveOrUpdate鍩烘湰涓婂氨鏄悎鎴愪簡save鍜寀pdate,鑰寀pdate鍙槸update;寮曠敤hibernate reference涓殑涓孌佃瘽鏉ヨВ閲婁粬浠殑浣跨敤鍦哄悎鍜屽尯鍒?br />
閫氬父涓嬮潰鐨勫満鏅細浣跨敤update()鎴杝aveOrUpdate()錛?
紼嬪簭鍦ㄧ涓涓猻ession涓姞杞藉璞?鎺ョ潃鎶妔ession鍏抽棴
璇ュ璞¤浼犻掑埌琛ㄧ幇灞?
瀵硅薄鍙戠敓浜嗕竴浜涙敼鍔?
璇ュ璞¤榪斿洖鍒頒笟鍔¢昏緫灞傛渶緇堝埌鎸佷箙灞?
紼嬪簭鍒涘緩絎簩session璋冪敤絎簩涓猻ession鐨剈pdate()鏂規硶鎸佷箙榪欎簺鏀瑰姩
saveOrUpdate(po)鍋氫笅闈㈢殑浜?
濡傛灉璇o瀵硅薄宸茬粡鍦ㄦ湰session涓寔涔呭寲浜嗭紝鍦ㄦ湰session涓墽琛宻aveOrUpdate涓嶅仛浠諱綍浜?
濡傛灉savaOrUpdate(鏂皃o)涓庡彟涓涓笌鏈瑂ession鍏寵仈鐨刾o瀵硅薄鎷ユ湁鐩稿悓鐨勬寔涔呭寲鏍囪瘑(identifier)錛屾姏鍑轟竴涓紓甯?
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]
saveOrUpdate濡傛灉瀵硅薄娌℃湁鎸佷箙鍖栨爣璇?identifier)灞炴э紝瀵瑰叾璋冪敤save() 錛屽惁鍒檜pdate() 榪欎釜瀵硅薄
鍥涖乸ersist鍜宻ave鍖哄埆
榪欎釜鏄渶榪風鐨勪竴瀵癸紝琛ㄩ潰涓婄湅璧鋒潵浣跨敤鍝釜閮借錛屽湪hibernate reference鏂囨。涓篃娌℃湁鏄庣‘鐨勫尯鍒嗕粬浠?
榪欓噷緇欏嚭涓涓槑紜殑鍖哄垎銆傦紙鍙互璺熻繘src鐪嬩竴涓嬶紝铏界劧瀹炵幇姝ラ綾諱技錛屼絾鏄繕鏄湁緇嗗井鐨勫樊鍒級
涓昏鍐呭鍖哄埆錛?br />
1錛宲ersist鎶婁竴涓灛鎬佺殑瀹炰緥鎸佷箙鍖栵紝浣嗘槸騫?涓嶄繚璇?鏍囪瘑絎?identifier涓婚敭瀵瑰簲鐨勫睘鎬?琚珛鍒誨~鍏ュ埌鎸佷箙鍖栧疄渚嬩腑錛屾爣璇嗙鐨勫~鍏ュ彲鑳借鎺ㄨ繜鍒癴lush鐨勬椂鍊欍?/p>
2錛宻ave, 鎶婁竴涓灛鎬佺殑瀹炰緥鎸佷箙鍖栨爣璇嗙錛屽強鏃剁殑浜х敓,瀹冭榪斿洖鏍囪瘑絎︼紝鎵浠ュ畠浼氱珛鍗蟲墽琛孲ql insert
浜斻乻aveOrUpdate,merge鍜寀pdate鍖哄埆
姣旇緝update鍜宮erge
update鐨勪綔鐢ㄤ笂杈硅浜嗭紝榪欓噷璇翠竴涓媘erge鐨?br />
濡傛灉session涓瓨鍦ㄧ浉鍚屾寔涔呭寲鏍囪瘑(identifier)鐨勫疄渚嬶紝鐢ㄧ敤鎴風粰鍑虹殑瀵硅薄瑕嗙洊session宸叉湁鐨勬寔涔呭疄渚?
(1)褰撴垜浠嬌鐢╱pdate鐨勬椂鍊欙紝鎵ц瀹屾垚鍚庯紝浼氭姏鍑哄紓甯?
(2)浣嗗綋鎴戜滑浣跨敤merge鐨勬椂鍊欙紝鎶婂鐞嗚嚜鐢辨佺殑po瀵硅薄A鐨勫睘鎬opy鍒皊ession褰撲腑澶勪簬鎸佷箙鎬佺殑po鐨勫睘鎬т腑錛屾墽琛屽畬鎴愬悗鍘熸潵鏄寔涔呯姸鎬佽繕鏄寔涔呮侊紝鑰屾垜浠彁渚涚殑A榪樻槸鑷敱鎬?/p>
鍏乫lush鍜寀pdate鍖哄埆
榪欎袱涓殑鍖哄埆濂界悊瑙?br />
update鎿嶄綔鐨勬槸鍦ㄨ嚜鐢辨佹垨鑴辯鐘舵?鍥爏ession鐨勫叧闂屽浜庤劚綆$姸鎬?鐨勫璞?/updateSQL
鑰宖lush鏄搷浣滅殑鍦ㄦ寔涔呯姸鎬佺殑瀵硅薄銆?br />
榛樿鎯呭喌涓嬶紝涓涓寔涔呯姸鎬佺殑瀵硅薄鐨勬敼鍔紙鍖呭惈set瀹瑰櫒錛夋槸涓嶉渶瑕乽pdate鐨勶紝鍙浣犳洿鏀逛簡瀵硅薄鐨勫鹼紝絳夊緟hibernate flush灝辮嚜鍔ㄦ洿鏂版垨淇濆瓨鍒版暟鎹簱浜嗐俬ibernate flush鍙戠敓鍦ㄤ互涓嬪嚑縐嶆儏鍐典腑錛?br />
1錛?璋冪敤鏌愪簺鏌ヨ鐨勫拰鎵嬪姩flush(),session鐨勫叧闂丼essionFactory鍏抽棴緇撳悎
get()涓涓璞★紝鎶婂璞$殑灞炴ц繘琛屾敼鍙?鎶婅祫婧愬叧闂?br />
2錛宼ransaction commit鐨勬椂鍊欙紙鍖呭惈浜唂lush錛?/p>
涓冦乴ock鍜寀pdate鍖哄埆
update鏄妸涓涓凡緇忔洿鏀硅繃鐨勮劚綆$姸鎬佺殑瀵硅薄鍙樻垚鎸佷箙鐘舵?br />
lock鏄妸涓涓病鏈夋洿鏀硅繃鐨勮劚綆$姸鎬佺殑瀵硅薄鍙樻垚鎸佷箙鐘舵?閽堝鐨勬槸鍥燬ession鐨勫叧闂屽浜庤劚綆$姸鎬佺殑po瀵硅薄(2)錛屼笉鑳介拡瀵瑰洜delete鑰屽浜庤劚綆$姸鎬佺殑po瀵硅薄)
瀵瑰簲鏇存敼涓涓褰曠殑鍐呭錛屼袱涓殑鎿嶄綔涓嶅悓錛?br />
update鐨勬搷浣滄楠ゆ槸錛?br />
(1)灞炴ф敼鍔ㄥ悗鐨勮劚綆$殑瀵硅薄鐨勪慨鏀?>璋冪敤update
lock鐨勬搷浣滄楠ゆ槸錛?br />
(2)璋冪敤lock鎶婃湭淇敼鐨勫璞′粠鑴辯鐘舵佸彉鎴愭寔涔呯姸鎬?->鏇存敼鎸佷箙鐘舵佺殑瀵硅薄鐨勫唴瀹?->絳夊緟flush鎴栬呮墜鍔╢lush
鍏乧lear鍜宔vcit鐨勫尯鍒?br />
clear瀹屾暣鐨勬竻闄ession緙撳瓨
evcit(obj)鎶婃煇涓寔涔呭寲瀵硅薄浠巗ession鐨勭紦瀛樹腑娓呯┖銆?br />