锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 娓哥鐘舵佺殑瀹炰緥鍙互閫氳繃璋冪敤save()銆乸ersist()鎴栬卻aveOrUpdate()鏂規硶榪涜鎸佷箙鍖栥?br />鎸佷箙鍖栧疄渚嬪彲浠ラ氳繃璋冪敤 delete()鍙樻垚鑴辯鐘舵併傞氳繃get()鎴杔oad()鏂規硶寰楀埌鐨勫疄渚嬮兘鏄寔涔呭寲鐘舵佺殑銆?br />鑴辯鐘舵佺殑瀹炰緥鍙互閫氳繃璋冪敤 update()銆?saveOrUpdate()銆乴ock()鎴栬卹eplicate()榪涜鎸佷箙鍖栥?/p>
save()鍜宲ersist()灝嗕細寮曞彂SQL鐨処NSERT錛宒elete()浼氬紩鍙慡QLDELETE錛?br />鑰寀pdate()鎴杕erge()浼氬紩鍙慡QLUPDATE銆傚鎸佷箙鍖栵紙persistent錛夊疄渚嬬殑淇敼鍦ㄥ埛鏂版彁浜ょ殑鏃跺欎細琚嫻嬪埌錛?br />瀹冧篃浼氬紩璧稴QLUPDATE銆俿aveOrUpdate()鎴栬卹eplicate()浼氬紩鍙慡QLINSERT鎴栬匲PDATE 浜屻乻ave 鍜寀pdate鍖哄埆 涓?update 鍜宻aveOrUpdate鍖哄埆 saveOrUpdate()鍋氫笅闈㈢殑浜? 鍥?persist鍜宻ave鍖哄埆 persist() is well defined. It makes a transient instance persistent. However, persist() also guarantees that it will not execute an INSERT statement if it is save() does not guarantee the same, it returns an identifier, and if an INSERT --------------------------------------------------------------------------------- 2錛宲ersist"淇濊瘉"錛屽綋瀹冨湪涓涓猼ransaction澶栭儴琚皟鐢ㄧ殑鏃跺欏茍涓嶈Е鍙戜竴涓猄ql Insert錛岃繖涓姛鑳芥槸寰堟湁鐢ㄧ殑錛?br />褰撴垜浠氳繃緇ф壙Session/persistence context鏉ュ皝瑁呬竴涓暱浼氳瘽嫻佺▼鐨勬椂鍊欙紝涓涓猵ersist榪欐牱鐨勫嚱鏁版槸闇瑕佺殑銆?/p>
3錛宻ave"涓嶄繚璇?絎?鏉?瀹冭榪斿洖鏍囪瘑絎︼紝鎵浠ュ畠浼氱珛鍗蟲墽琛孲ql insert錛屼笉綆℃槸涓嶆槸鍦╰ransaction鍐呴儴榪樻槸澶栭儴 鍏?flush鍜寀pdate鍖哄埆 涓?lock鍜寀pdate鍖哄埆 鍙傝冨唴瀹癸細
JDBC浜嬪姟鐢盋onnnection綆$悊錛屼篃灝辨槸璇達紝浜嬪姟綆$悊瀹為檯涓婃槸鍦↗DBC Connection
涓疄鐜般備簨鍔″懆鏈熼檺浜嶤onnection鐨勭敓鍛藉懆鏈熶箣鍐?br>
JTA 浜嬪姟綆$悊鍒欑敱 JTA 瀹瑰櫒瀹炵幇錛孞TA 瀹瑰櫒瀵瑰綋鍓嶅姞鍏ヤ簨鍔$殑浼楀Connection 榪?br>琛岃皟搴︼紝瀹炵幇鍏朵簨鍔℃ц姹傘侸TA鐨勪簨鍔″懆鏈熷彲妯法澶氫釜JDBC Connection鐢熷懡鍛ㄦ湡銆?br>
浜屻佸湪浜嗚Вjdbc鍜宩ta浜嬪姟鐨勫熀紜涓婏紝鍐嶆潵璁ㄨhibernate鐨勪袱縐嶄簨鍔?br>瀵逛簬鍩轟簬JDBC Transaction鐨凥ibernate 浜嬪姟綆$悊鏈哄埗鑰岃█錛屼簨鍔$鐞嗗湪Session 鎵渚濇墭鐨凧DBC Connection
涓疄鐜幫紝浜嬪姟鍛ㄦ湡闄愪簬Session鐨勭敓鍛藉懆鏈熴?br>
瀵逛簬鍩轟簬JTA浜嬪姟鐨凥ibernate鑰岃█錛孞TA浜嬪姟妯法鍙í璺ㄥ涓猄ession銆?br>涓夈乭ibernate涓啓娉曠殑涓嶅悓
jdbc鐨勫啓娉?br>
public void saveUser()
{
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
session.close();
}
蹇呴』鍦╯ession.close()涔嬪墠commit鎴栬卹ollback
jta鍐欐硶
public void saveUser()
{
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user);
session.close();
Session session1 = sessionFactory.openSession();
session1.save(user1);
session.close();
tx.commit();
}
commit鍜宺ollback鍙互鍦╯ession.close()涔嬪悗鎵ц.
鍚屾椂搴旇娉ㄦ剰鐨勪竴鐐規槸錛屼簨鍔℃槸涓嶈兘宓屽鐨勶紝鍦ㄤ嬌鐢╦ta鐨勪簨鍔$殑鎯呭喌涓嬶紝濡傛灉瑕佽涓涓簨鍔¤法瓚婁袱涓?br>
session,鍒欏繀欏誨湪涓や釜session鐨勫灞傚紑濮嬩簨鍔″拰瀹屾垚浜嬪姟銆傝屼笉鑳藉啀鍦╯ession鍐呴儴寮濮嬩簨鍔″拰瀹屾垚浜嬪姟銆?/span>
2錛屽湪閰嶅悎spring浣跨敤鐨勬椂鍊欎細鍙兘浼氭姏鍑簅rg.springframework.dao.InvalidDataAccessApiUsageException
鍏堣1錛岃繖涓紓甯哥殑鎶涘嚭鍘熷洜鍜岃В鍐沖姙娉曡榪欓噷錛?br>javaeye涓婃湁浜嗗緢濂界殑浜嬩緥:http://www.javaeye.com/topic/11581
瑙e喅鍔炴硶鍙互鐢╩erge錛屼篃鍙互鍒殑鍔炴硶銆?br>鍑虹幇鐨勫師鍥狅紝鍙互鍙傝冧竴涓嬫垜鍓嶈竟鐨勬枃绔犱腑灝唌erge鍜寀pdate鐨勫尯鍒殑鍐呭銆?br>http://www.tkk7.com/dreamstone/archive/2007/07/29/133071.html
2鐨勮В鍐沖姙娉曪細鍦ㄨ繖閲?br>springside鐨勪竴綃囨枃绔犲仛浜嗚緇嗚鏄?br>http://calvin.blog.javascud.org/post/46.htm
濂戒簡錛岀幇鍦ㄩ棶棰樿В鍐充簡錛屼絾鍏充簬open-session-in-view鐨勪嬌鐢ㄨ繕鏈変竴浜涙帰璁紝鏄惁搴旇浣跨敤錛屼嬌鐢ㄧ殑濂藉涓庡潖澶勩?br>瑙佽繖涓ょ瘒jdon涓婄殑鏂囩珷:
http://www.jdon.com/jivejdon/thread/22374.html
http://www.jdon.com/jivejdon/thread/28955.html
鍦ㄦ墍鏈変箣鍓嶏紝璇存槑涓涓嬶紝瀵逛簬hibernate錛屽畠鐨勫璞℃湁涓夌鐘舵侊紝transient銆乸ersistent銆乨etached
涓嬭竟鏄父瑙佺殑緲昏瘧鍔炴硶錛?br />transient錛氱灛鎬佹垨鑰呰嚜鐢辨?br />persistent錛氭寔涔呭寲鐘舵?br />detached錛氳劚綆$姸鎬佹垨鑰呮父紱繪?/p>
鎶婅繖涓瀵規斁鍦ㄧ涓浣嶇殑鍘熷洜鏄洜涓鴻繖涓瀵規槸鏈甯哥敤鐨勩?br />save鐨勪綔鐢ㄦ槸鎶婁竴涓柊鐨勫璞′繚瀛?br />update鏄妸涓涓劚綆$姸鎬佺殑瀵硅薄淇濆瓨
榪欎釜鏄瘮杈冨ソ鐞嗚В鐨勶紝欏懼悕鎬濅箟錛宻aveOrUpdate鍩烘湰涓婂氨鏄悎鎴愪簡save鍜寀pdate
寮曠敤hibernate reference涓殑涓孌佃瘽鏉ヨВ閲婁粬浠殑浣跨敤鍦哄悎鍜屽尯鍒?br />閫氬父涓嬮潰鐨勫満鏅細浣跨敤update()鎴杝aveOrUpdate()錛?
紼嬪簭鍦ㄧ涓涓猻ession涓姞杞藉璞?
璇ュ璞¤浼犻掑埌琛ㄧ幇灞?
瀵硅薄鍙戠敓浜嗕竴浜涙敼鍔?
璇ュ璞¤榪斿洖鍒頒笟鍔¢昏緫灞?
紼嬪簭璋冪敤絎簩涓猻ession鐨剈pdate()鏂規硶鎸佷箙榪欎簺鏀瑰姩
濡傛灉瀵硅薄宸茬粡鍦ㄦ湰session涓寔涔呭寲浜嗭紝涓嶅仛浠諱綍浜?
濡傛灉鍙︿竴涓笌鏈瑂ession鍏寵仈鐨勫璞℃嫢鏈夌浉鍚岀殑鎸佷箙鍖栨爣璇?identifier)錛屾姏鍑轟竴涓紓甯?
濡傛灉瀵硅薄娌℃湁鎸佷箙鍖栨爣璇?identifier)灞炴э紝瀵瑰叾璋冪敤save()
濡傛灉瀵硅薄鐨勬寔涔呮爣璇?identifier)琛ㄦ槑鍏舵槸涓涓柊瀹炰緥鍖栫殑瀵硅薄錛屽鍏惰皟鐢╯ave()
濡傛灉瀵硅薄鏄檮甯︾増鏈俊鎭殑錛堥氳繃<version>鎴?lt;timestamp>錛?騫朵笖鐗堟湰灞炴х殑鍊艱〃鏄庡叾鏄竴涓柊瀹炰緥鍖栫殑瀵硅薄錛宻ave()瀹冦?
鍚﹀垯update() 榪欎釜瀵硅薄
榪欎釜鏄渶榪風鐨勪竴瀵癸紝琛ㄩ潰涓婄湅璧鋒潵浣跨敤鍝釜閮借錛屽湪hibernate reference鏂囨。涓篃娌℃湁鏄庣‘鐨勫尯鍒嗕粬浠?
榪欓噷緇欏嚭涓涓槑紜殑鍖哄垎銆傦紙鍙互璺熻繘src鐪嬩竴涓嬶紝铏界劧瀹炵幇姝ラ綾諱技錛屼絾鏄繕鏄湁緇嗗井鐨勫樊鍒級
榪欓噷鍙傝?a >http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682涓殑涓涓鏄庯細
---------------------------------------------------------------------------------
I found that a lot of people have the same doubt. To help to solve this issue
I'm quoting Christian Bauer:
"In case anybody finds this thread...
it doesn't guarantee that the identifier value will be assigned to the persistent
instance immediately, the assignment might happen at flush time. The spec doesn't say
that, which is the problem I have with persist().
called outside of transaction boundaries. This is useful in long-running conversations
with an extended Session/persistence context.A method like persist() is required.
has to be executed to get the identifier (e.g. "identity" generator, not "sequence"),
this INSERT happens immediately, no matter if you are inside or outside of a transaction. This is not good in a long-running conversation with an extended Session/persistence context."
綆鍗曠炕璇戜竴涓嬩笂杈圭殑鍙ュ瓙鐨勪富瑕佸唴瀹癸細
1錛宲ersist鎶婁竴涓灛鎬佺殑瀹炰緥鎸佷箙鍖栵紝浣嗘槸騫?涓嶄繚璇?鏍囪瘑絎﹁绔嬪埢濉叆鍒版寔涔呭寲瀹炰緥涓紝鏍囪瘑絎︾殑濉叆鍙兘琚帹榪?br />鍒癴lush鐨勬椂闂淬?/p>
浜?saveOrUpdateCopy,merge鍜寀pdate鍖哄埆
棣栧厛璇存槑merge鏄敤鏉ヤ唬鏇縮aveOrUpdateCopy鐨勶紝榪欎釜璇︾粏瑙佽繖閲?br />http://www.tkk7.com/dreamstone/archive/2007/07/28/133053.html
鐒跺悗姣旇緝update鍜宮erge
update鐨勪綔鐢ㄤ笂杈硅浜嗭紝榪欓噷璇翠竴涓媘erge鐨?br />濡傛灉session涓瓨鍦ㄧ浉鍚屾寔涔呭寲鏍囪瘑(identifier)鐨勫疄渚嬶紝鐢ㄧ敤鎴風粰鍑虹殑瀵硅薄鐨勭姸鎬佽鐩栨棫鏈夌殑鎸佷箙瀹炰緥
濡傛灉session娌℃湁鐩稿簲鐨勬寔涔呭疄渚嬶紝鍒欏皾璇曚粠鏁版嵁搴撲腑鍔犺澆錛屾垨鍒涘緩鏂扮殑鎸佷箙鍖栧疄渚?鏈鍚庤繑鍥炶鎸佷箙瀹炰緥
鐢ㄦ埛緇欏嚭鐨勮繖涓璞℃病鏈夎鍏寵仈鍒皊ession涓婏紝瀹冧緷鏃ф槸鑴辯鐨?
閲嶇偣鏄渶鍚庝竴鍙ワ細
褰撴垜浠嬌鐢╱pdate鐨勬椂鍊欙紝鎵ц瀹屾垚鍚庯紝鎴戜滑鎻愪緵鐨勫璞鐨勭姸鎬佸彉鎴愭寔涔呭寲鐘舵?br />浣嗗綋鎴戜滑浣跨敤merge鐨勬椂鍊欙紝鎵ц瀹屾垚錛屾垜浠彁渚涚殑瀵硅薄A榪樻槸鑴辯鐘舵侊紝hibernate鎴栬卬ew浜嗕竴涓狟錛屾垨鑰呮绱㈠埌
涓涓寔涔呭璞錛屽茍鎶婃垜浠彁渚涚殑瀵硅薄A鐨勬墍鏈夌殑鍊兼嫹璐濆埌榪欎釜B錛屾墽琛屽畬鎴愬悗B鏄寔涔呯姸鎬侊紝鑰屾垜浠彁渚涚殑A榪樻槸鎵樼鐘舵?/p>
榪欎袱涓殑鍖哄埆濂界悊瑙?br />update鎿嶄綔鐨勬槸鍦ㄨ劚綆$姸鎬佺殑瀵硅薄
鑰宖lush鏄搷浣滅殑鍦ㄦ寔涔呯姸鎬佺殑瀵硅薄銆?br />榛樿鎯呭喌涓嬶紝涓涓寔涔呯姸鎬佺殑瀵硅薄鏄笉闇瑕乽pdate鐨勶紝鍙浣犳洿鏀逛簡瀵硅薄鐨勫鹼紝絳夊緟hibernate flush灝辮嚜鍔?br />淇濆瓨鍒版暟鎹簱浜嗐俬ibernate flush鍙戠敓鍐嶅嚑縐嶆儏鍐典笅錛?br />1錛岃皟鐢ㄦ煇浜涙煡璇㈢殑鏃跺?br />2錛宼ransaction commit鐨勬椂鍊?br />3錛屾墜鍔ㄨ皟鐢╢lush鐨勬椂鍊?
update鏄妸涓涓凡緇忔洿鏀硅繃鐨勮劚綆$姸鎬佺殑瀵硅薄鍙樻垚鎸佷箙鐘舵?br />lock鏄妸涓涓病鏈夋洿鏀硅繃鐨勮劚綆$姸鎬佺殑瀵硅薄鍙樻垚鎸佷箙鐘舵?br />瀵瑰簲鏇存敼涓涓褰曠殑鍐呭錛屼袱涓殑鎿嶄綔涓嶅悓錛?br />update鐨勬搷浣滄楠ゆ槸錛?br />錛?錛夋洿鏀硅劚綆$殑瀵硅薄->璋冪敤update
lock鐨勬搷浣滄楠ゆ槸錛?br />(2)璋冪敤lock鎶婂璞′粠鑴辯鐘舵佸彉鎴愭寔涔呯姸鎬?->鏇存敼鎸佷箙鐘舵佺殑瀵硅薄鐨勫唴瀹?->絳夊緟flush鎴栬呮墜鍔╢lush
http://www.tkk7.com/iamtin/archive/2006/03/06/33910.aspx
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682
http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/objectstate.html
hibernate鐨勬煡璇㈡湁寰堝,Query,find,Criteria,get,load
query浣跨敤hsql璇彞錛屽彲浠ヨ緗弬鏁版槸甯哥敤鐨勪竴縐嶆柟寮?/p>
criteria鐨勬柟寮忥紝灝介噺閬垮厤浜嗗啓hql璇彞錛岀湅璧鋒潵鏇撮潰鍚戝璞′簡銆?/p>
find鏂瑰紡錛岃繖縐嶆柟寮忓凡緇忚鏂扮殑hibernate涓㈠純瑙佽繖閲?br>http://www.tkk7.com/dreamstone/archive/2007/07/28/133053.html
get鍜?span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: blue; PADDING-TOP: 0px; BACKGROUND-COLOR: #ccffff; blue: ">load鏂瑰紡鏄牴鎹甶d鍙栧緱涓涓褰?br>涓嬭竟璇︾粏璇翠竴涓媑et鍜?span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: blue; PADDING-TOP: 0px; BACKGROUND-COLOR: #ccffff; blue: ">load鐨勪笉鍚岋紝鍥犱負鏈変簺鏃跺欎負浜嗗姣斾篃浼氭妸find鍔犺繘鏉ャ?/p>
1錛屼粠榪斿洖緇撴灉涓婂姣旓細
load鏂瑰紡媯绱笉鍒扮殑璇濅細鎶涘嚭org.hibernate.ObjectNotFoundException寮傚父
get鏂規硶媯绱笉鍒扮殑璇濅細榪斿洖null
2錛屼粠媯绱㈡墽琛屾満鍒朵笂瀵規瘮錛?br>get鏂規硶鍜?span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: red; PADDING-TOP: 0px; BACKGROUND-COLOR: #ffeeee; red: ">find鏂規硶閮芥槸鐩存帴浠庢暟鎹簱涓绱?br>鑰?span id=highlight_tag style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: blue; PADDING-TOP: 0px; BACKGROUND-COLOR: #ccffff; blue: ">load鏂規硶鐨勬墽琛屽垯姣旇緝澶嶆潅
1,棣栧厛鏌ユ壘session鐨刾ersistent Context涓槸鍚︽湁緙撳瓨錛屽鏋滄湁鍒欑洿鎺ヨ繑鍥?br>2,濡傛灉娌℃湁鍒欏垽鏂槸鍚︽槸lazy錛屽鏋滀笉鏄洿鎺ヨ闂暟鎹簱媯绱紝鏌ュ埌璁板綍榪斿洖錛屾煡涓嶅埌鎶涘嚭寮傚父
3,濡傛灉鏄痩azy鍒欓渶瑕佸緩绔嬩唬鐞嗗璞★紝瀵硅薄鐨刬nitialized灞炴т負false錛宼arget灞炴т負null
4, 鍦ㄨ闂幏寰楃殑浠g悊瀵硅薄鐨勫睘鎬ф椂,媯绱㈡暟鎹簱錛屽鏋滄壘鍒拌褰曞垯鎶婅璁板綍鐨勫璞″鍒跺埌浠g悊瀵硅薄鐨則arget
涓婏紝騫跺皢initialized=true錛屽鏋滄壘涓嶅埌灝辨姏鍑哄紓甯?銆?br>
浠ュ墠鐨勭瓥鐣ユ槸錛?br>灝介噺緇欏嚭鍏ㄧ殑鎺ュ彛錛岃繖鏍峰噺灝戠敤鎴風殑浠g爜閲忥紝鎵浠ilter鐩存帴榪斿洖collection錛宨terate鐩存帴榪斿洖
iterate銆備絾榪欐牱鐨勭粨鏋滄槸榪囧害鐨勬彁渚涙帴鍙o紝閫犳垚浜嗗涔犱笂鐨勮礋鎷呭拰閫夋嫨涓婄殑璐熸媴銆傚浣曡浣忚繖浜涘嚱鏁幫紝濡備綍鍦ㄤ紬澶氬嚱鏁?br>涓夋嫨鏄釜楹葷儲浜嬫儏銆?br>鍑℃槸鍋歫ava鐨勯兘鐭ラ亾錛岀敤涓涓猨ava鐨勪笢瑗挎渶杈涜嫤鐨勬槸閫夋嫨錛屽湪寮婧愮殑涓栫晫閲岃竟閫夋嫨涓涓傚悎鑷繁鐨勫伐紼嬶紝鍐嶅湪榪欎釜閫夋嫨鐨勫伐紼嬮噷杈歸夋嫨瀹炵幇鏂規硶
鍥犱負鍙兘鎻愪緵寰堝縐嶅疄鐜版柟娉曪紝鑰屼笖鏈変簺榪樻槸deprecated鐨勩?/p>
鐜板湪鐨勭瓥鐣ワ細
灝介噺綆鍖栨帴鍙o紝鎴栧噺灝戝嚱鏁幫紝鎴栬呯畝鍖栧嚱鏁板悕錛屼緥濡傛妸saveOrUpdateCopy鍙樻垚merge銆?br>榪欐牱鐨勫ソ澶勬槸璁板繂瀛︿範璐熸媴灝戙傚鍐欏嚑鍙ヤ唬鐮佷笉鏄壒鍒夯鐑︺傚叾瀹炴垜涓漢鏉ヨ鏇村枩嬈㈢幇鍦ㄧ殑鎰熻銆?br>浠ュ墠鐨勭瓥鐣ュ叾瀹炲緢澶х▼搴︿笂鏄弧瓚崇▼搴忓憳鐨勪釜浜洪渶姹傦紝鏇存湁鎴愬氨鎰熴備絾紜笉閫傚悎浣跨敤鑰呯殑闇姹傘?/p>
ok錛屾棤璁哄浣曠幇鍦ㄧ殑鎯呭喌鏄洿濂戒簡銆?/p>