锘??xml version="1.0" encoding="utf-8" standalone="yes"?>嫻呰皥Hibernate鐨刦lush鏈哄埗
榪欐槸鍦ㄤ竴嬈′簨鍔℃彁浜ゆ椂閬囧埌鐨勫紓甯搞?br /> an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
net.sf.hibernate.AssertionFailure: possible nonthreadsafe access to session
娉細闈瀙ossible non-threadsafe access to the session 錛堥偅鏄彟澶栫殑閿欒錛岀被浼間絾涓嶄竴鏍鳳級
榪欎釜寮傚父搴旇寰堝鐨勬湅鍙嬮兘閬囧埌榪囷紝鍘熷洜鍙兘鍚勪笉鐩稿悓銆備絾鎵鏈夌殑寮傚父閮藉簲璇ユ槸鍦╢lush鎴栬呬簨鍔℃彁浜ょ殑榪囩▼涓彂鐢熺殑銆傝繖涓鑸敱鎴戜滑鍦ㄤ簨鍔″紑濮嬭嚦浜嬪姟鎻愪氦鐨?榪囩▼涓繘琛屼簡涓嶆紜殑鎿嶄綔瀵艱嚧錛屼篃浼氬湪澶氱嚎紼嬪悓鏃舵搷浣滀竴涓猄ession鏃跺彂鐢燂紝榪欓噷鎴戜滑浠呬粎璁ㄨ鍗曠嚎紼嬬殑鎯呭喌錛屽綰跨▼闄や簡綰跨▼鍚屾澶栧熀鏈笌姝ょ浉鍚屻?br /> 鑷充簬鍏蜂綋鏄粈涔堟牱鐨勯敊璇搷浣滈偅錛熸垜緇欏ぇ瀹剁湅涓涓緥瀛愶紙鍋囪Hibernate閰嶇疆姝g‘錛屼負淇濇寔浠g爜綆媧侊紝涓嶅紩鍏ュ寘鍙婂鐞嗕換浣曞紓甯革級
SessionFactory sf = new Configuration().configure().buildSessionFactory() ;
Session s = sf.openSession();
Cat cat = new Cat();
Transaction tran = s.beginTransaction(); (1)
s.save(cat); (2)錛堟澶勫悓鏍峰彲浠ヤ負update delete錛?br /> s.evict(cat); (3)
tran.commit(); (4)
s.close();(5)
榪欏氨鏄紩璧鋒寮傚父鐨勫吀鍨嬮敊璇傛垜褰撴椂灝遍亣鍒頒簡榪欎釜寮傚父錛屾鏌ヤ唬鐮佹椂鏍規(guī)湰娌℃劅瑙夊埌榪欐浠g爜鍑轟簡闂錛屾兂褰撶劧鐨勮涓哄湪Session涓婂紑濮嬩竴涓簨鍔★紝閫氳繃 Session灝嗗璞″瓨鍏ユ暟鎹簱錛屽啀灝嗚繖涓璞′粠Session涓婃媶紱伙紝鎻愪氦浜嬪姟錛岃繖鏄竴涓緢姝e父鐨勬祦紼嬨傚鏋滆繖閲屾甯哥殑璇濓紝閭i棶棰樹竴瀹氬湪鍒銆?
闂鎭版伆灝卞湪榪欓噷錛屾垜鐨勬兂娉曚篃璁告病鏈夐敊錛屼絾鏄竴涓敊璇殑璁烘嵁鎵寮曞嚭鐨勮鐐規(guī)案榪滈兘涓嶅彲鑳芥槸姝g‘鐨勩傚洜涓烘垜涓鐩翠互涓虹洿鎺ュ湪瀵規(guī)暟鎹簱榪涜鎿嶄綔錛屽繕璁頒簡鍦ㄦ垜涓庢暟鎹?搴撲箣闂撮殧浜嗕竴涓狧ibernate錛孒ibernate鍦ㄤ負鎴戜滑鎻愪緵鎸佷箙鍖栨湇鍔$殑鍚屾椂錛屼篃鏀瑰彉浜嗘垜浠鏁版嵁搴撶殑鎿嶄綔鏂瑰紡錛岃繖縐嶆柟寮忎笌鎴戜滑鐩存帴鐨勬暟鎹簱鎿嶄綔 鏈夌潃寰堝鐨勪笉鍚岋紝姝e洜涓烘垜浠榪欑鏂瑰紡娌℃湁涓涓ぇ鑷寸殑浜嗚В閫犳垚浜嗘垜浠殑搴旂敤騫舵湭寰楀埌棰勫厛璁炬兂鐨勭粨鏋溿?br /> 閭ibernate鐨勬寔涔呭寲鏈哄埗鍒板簳鏈変粈涔堜笉鍚岄偅錛熺畝鍗曠殑璇達紝Hibernate鍦ㄦ暟鎹簱灞備箣涓婂疄鐜頒簡涓涓紦瀛樺尯錛屽綋搴旂敤save鎴栬卽pdate涓涓?瀵硅薄鏃訛紝Hibernate騫舵湭灝嗚繖涓璞″疄闄呯殑鍐欏叆鏁版嵁搴撲腑錛岃屼粎浠呮槸鍦ㄧ紦瀛樹腑鏍規(guī)嵁搴旂敤鐨勮涓哄仛浜嗙櫥璁幫紝鍦ㄧ湡姝i渶瑕佸皢緙撳瓨涓殑鏁版嵁flush鍏ユ暟鎹簱鏃?鎵嶆墽琛屽厛鍓嶇櫥璁扮殑鎵鏈夎涓恒?br /> 鍦ㄥ疄闄呮墽琛岀殑榪囩▼涓紝姣忎釜Session鏄氳繃鍑犱釜鏄犲皠鍜岄泦鍚堟潵緇存姢鎵鏈変笌璇ession寤虹珛浜嗗叧鑱旂殑瀵硅薄浠ュ強搴旂敤瀵硅繖浜涘璞℃墍榪涜鐨勬搷浣滅殑錛屼笌鎴戜滑榪?嬈¤璁烘湁鍏崇殑鏈塭ntityEntries錛堜笌Session鐩稿叧鑱旂殑瀵硅薄鐨勬槧灝勶級銆乮nsertions錛堟墍鏈夌殑鎻掑叆鎿嶄綔闆嗗悎錛夈?deletions錛堝垹闄ゆ搷浣滈泦鍚堬級銆乽pdates錛堟洿鏂版搷浣滈泦鍚堬級銆備笅闈㈡垜灝卞紑濮嬭В閲婂湪鏈寮濮嬬殑渚嬪瓙涓紝Hibernate鍒板簳鏄庢牱榪愪綔鐨勩?br /> (1)鐢熸垚涓涓簨鍔$殑瀵硅薄錛屽茍鏍囪褰撳墠鐨凷ession澶勪簬浜嬪姟鐘舵侊紙娉細姝ゆ椂騫舵湭鍚姩鏁版嵁搴撶駭浜嬪姟錛夈?br /> (2)搴旂敤浣跨敤s.save淇濆瓨cat瀵硅薄錛岃繖涓椂鍊橲ession灝哻at榪欎釜瀵硅薄鏀懼叆entityEntries錛岀敤鏉ユ爣璁癱at宸茬粡鍜屽綋鍓嶇殑浼氳瘽寤?绔嬩簡鍏寵仈錛岀敱浜庡簲鐢ㄥcat鍋氫簡淇濆瓨鐨勬搷浣滐紝Session榪樿鍦╥nsertions涓櫥璁板簲鐢ㄧ殑榪欎釜鎻掑叆琛屼負錛堣涓哄寘鎷細瀵硅薄寮曠敤銆佸璞d銆?Session銆佹寔涔呭寲澶勭悊綾伙級銆?br /> (3)s.evict(cat)灝哻at瀵硅薄浠巗浼氳瘽涓媶紱伙紝榪欐椂s浼氫粠entityEntries涓皢cat榪欎釜瀵硅薄縐誨嚭銆?br /> (4)浜嬪姟鎻愪氦錛岄渶瑕佸皢鎵鏈夌紦瀛榝lush鍏ユ暟鎹簱錛孲ession鍚姩涓涓簨鍔★紝騫舵寜鐓nsert,update,……,delete鐨勯『搴忔彁浜ゆ墍鏈?涔嬪墠鐧昏鐨勬搷浣滐紙娉ㄦ剰錛氭墍鏈塱nsert鎵ц瀹屾瘯鍚庢墠浼氭墽琛寀pdate錛岃繖閲岀殑鐗規(guī)畩澶勭悊涔熷彲鑳戒細灝嗕綘鐨勭▼搴忔悶寰椾竴鍥㈢碂錛屽闇瑕佹帶鍒舵搷浣滅殑鎵ц欏哄簭錛岃鍠?浜庝嬌鐢╢lush錛夛紝鐜板湪cat涓嶅湪entityEntries涓紝浣嗗湪鎵цinsert鐨勮涓烘椂鍙渶瑕佽闂甶nsertions灝辮凍澶熶簡錛屾墍浠ユ鏃朵笉浼?鏈変換浣曠殑寮傚父銆傚紓甯稿嚭鐜板湪鎻掑叆鍚庨氱煡Session璇ュ璞″凡緇忔彃鍏ュ畬姣曡繖涓楠や笂錛岃繖涓楠や腑闇瑕佸皢entityEntries涓璫at鐨?existsInDatabase鏍囧織緗負true錛岀敱浜巆at騫朵笉瀛樺湪浜巈ntityEntries涓紝姝ゆ椂Hibernate灝辮涓?insertions鍜宔ntityEntries鍙兘鍥犱負綰跨▼瀹夊叏鐨勯棶棰樹駭鐢熶簡涓嶅悓姝ワ紙涔熶笉鐭ラ亾Hibernate鐨勫紑鍙戣呮槸鍚﹁冭檻鍒頒緥瀛愪腑鐨勫鐞嗘柟 寮忥紝濡傛灉娌℃湁鐨勮瘽錛岃繖涔熻綆楁槸涓涓猙ug鍚э級錛屼簬鏄竴涓猲et.sf.hibernate.AssertionFailure灝辮鎶涘嚭錛岀▼搴忕粓姝€?br />
鎴戞兂鐜板湪澶у搴旇鏄庣櫧渚嬪瓙涓殑紼嬪簭鍒板簳鍝噷鏈夐棶棰樹簡鍚э紝鎴戜滑鐨勯敊璇殑璁や負s.save浼氱珛鍗崇殑鎵ц錛岃屽皢cat瀵硅薄榪囨棭鐨勪笌Session鎷嗙錛岄犳垚浜?Session鐨刬nsertions鍜宔ntityEntries涓唴瀹圭殑涓嶅悓姝ャ傛墍浠ユ垜浠湪鍋氭綾繪搷浣滄椂涓瀹氳娓呮Hibernate浠涔堟椂鍊欎細灝嗘暟 鎹甪lush鍏ユ暟鎹簱錛屽湪鏈猣lush涔嬪墠涓嶈灝嗗凡榪涜鎿嶄綔鐨勫璞′粠Session涓婃媶紱匯?br />
瀵逛簬榪欎釜閿欒鐨勮В鍐蟲柟娉曟槸錛屾垜浠彲浠ュ湪(2)鍜?3)涔嬮棿鎻掑叆涓涓猻.flush()寮哄埗Session灝嗙紦瀛樹腑鐨勬暟鎹甪lush鍏ユ暟鎹簱錛堟鏃?Hibernate浼氭彁鍓嶅惎鍔ㄤ簨鍔★紝灝?2)涓殑save鐧昏鐨刬nsert璇彞鐧昏鍦ㄦ暟鎹簱浜嬪姟涓紝騫跺皢鎵鏈夋搷浣滈泦鍚堟竻絀猴級錛岃繖鏍峰湪(4)浜嬪姟鎻愪氦鏃?insertions闆嗗悎灝卞凡緇忔槸絀虹殑浜嗭紝鍗充嬌鎴戜滑鎷嗙浜哻at涔熶笉浼氭湁浠諱綍鐨勫紓甯鎬簡銆?br /> 鍓嶉潰綆鍗曠殑浠嬬粛浜嗕竴涓婬ibernate鐨刦lush鏈哄埗鍜屽鎴戜滑紼嬪簭鍙兘甯︽潵鐨勫獎鍝嶄互鍙婄浉搴旂殑瑙e喅鏂規(guī)硶錛孒ibernate鐨勭紦瀛樻満鍒惰繕浼氬湪鍏朵粬鐨勬柟闈㈢粰鎴戜滑鐨勭▼搴忓甫鏉ヤ竴浜涙剰鎯充笉鍒扮殑褰卞搷銆傜湅涓嬮潰鐨勪緥瀛愶細
錛坣ame涓篶at琛ㄧ殑涓婚敭錛?br /> Cat cat = new Cat();
cat.setName(“tom”);
s.save(cat);
cat.setName(“mary”);
s.update(cat);(6)
Cat littleCat = new Cat();
littleCat.setName(“tom”);
s.save(littleCat);
s.flush();
榪欎釜渚嬪瓙鐪嬭搗鏉ユ湁浠涔堥棶棰橈紵浼拌涓嶄簡瑙ibernate緙撳瓨鏈哄埗鐨勪漢澶氬崐浼氳娌℃湁闂錛屼絾瀹冧篃涓鏍蜂笉鑳芥寜鐓ф垜浠殑鎬濊礬姝e父榪愯錛屽湪flush榪囩▼涓細浜?鐢熶富閿啿紿侊紝鍙兘浣犳兂闂細“鍦╯ave(littleCat)涔嬪墠涓嶆槸宸茬粡鏇存敼cat.name騫跺凡緇忔洿鏂頒簡涔堬紵涓轟粈涔堣繕浼氬彂鐢熶富閿啿紿侀偅錛?#8221;榪欓噷鐨勫師鍥?灝辨槸鎴戝湪瑙i噴絎竴涓緥瀛愭椂鎵鎻愬埌鐨勭紦瀛榝lush欏哄簭鐨勯棶棰橈紝Hibernate鎸夌収insert,update,……,delete鐨勯『搴忔彁浜ゆ墍鏈夌櫥璁?鐨勬搷浣滐紝鎵浠ヤ綘鐨剆.update(cat)铏界劧鍦ㄧ▼搴忎腑鍑虹幇鍦╯.save(littleCat)涔嬪墠錛屼絾鏄湪flush鐨勮繃紼嬩腑錛屾墍鏈夌殑save閮藉皢 鍦╱pdate涔嬪墠鎵ц錛岃繖灝遍犳垚浜嗕富閿啿紿佺殑鍙戠敓銆?br /> 榪欎釜渚嬪瓙涓殑鏇存敼鏂規(guī)硶涓鏍鋒槸鍦?6)涔嬪悗鍔犲叆s.flush()寮哄埗Session鍦ㄤ繚瀛榣ittleCat涔嬪墠鏇存柊cat鐨刵ame銆傝繖鏍峰湪絎簩嬈?flush鏃跺氨鍙細鎵цs.save(littleCat)榪欐鐧昏鐨勫姩浣滐紝榪欐牱灝變笉浼氬嚭鐜頒富閿啿紿佺殑鐘跺喌銆傚啀鐪嬩竴涓緥瀛愶紙寰堝鎬殑渚嬪瓙錛屼絾鏄兘澶熻鏄庨棶 棰橈級
Cat cat = new Cat();
cat.setName(“tom”);
s.save(cat); (7)
s.delete(cat);(8)
cat.id=null;(9)
s.save(cat);(10)
s.flush();
榪欎釜渚嬪瓙鍦ㄨ繍琛屾椂浼氫駭鐢熷紓甯竛et.sf.hibernate.HibernateException: identifier of an instance of Cat altered from 8b818e920a86f038010a86f03a9d0001 to null榪欓噷渚嬪瓙涔熸槸鏈夊叧浜庣紦瀛樼殑闂錛屼絾鏄師鍥犵◢鏈変笉鍚岋細錛?錛夊拰錛?錛夌殑澶勭悊鐩稿悓銆傦紙8錛塖ession浼氬湪deletions涓櫥璁拌繖涓垹闄ゅ姩浣滐紝鍚屾椂鏇存柊entityEntries涓瀵硅薄鐨勭櫥璁扮姸鎬佷負DELETED銆傦紙9錛塁at綾葷殑鏍囪瘑絎﹀瓧孌典負id,灝嗗叾緗負null渚夸簬閲嶆柊鍒嗛厤id騫朵繚瀛樿繘鏁版嵁搴撱?
錛?0錛夋鏃禨ession浼氶鍏堝湪entityEntries鏌ユ壘cat瀵硅薄鏄惁鏇劇粡涓嶴ession鍋氳繃鍏寵仈錛屽洜涓篶at鍙敼鍙樹簡灞炴у鹼紝寮曠敤騫舵湭鏀?鍙橈紝鎵浠ヤ細鍙栧緱鐘舵佷負DELETED鐨勯偅涓櫥璁板璞°傜敱浜庣浜屾淇濆瓨鐨勫璞″凡緇忓湪褰撳墠Session涓垹闄わ紝save浼氬己鍒禨ession灝嗙紦瀛?flush鎵嶄細緇х畫錛宖lush鐨勮繃紼嬩腑棣栧厛瑕佹墽琛屾渶寮濮嬬殑save鍔ㄤ綔錛屽湪榪欎釜save涓鏌ヤ簡cat榪欎釜瀵硅薄鐨刬d鏄惁涓庡師鏉ユ墽琛屽姩浣滄椂鐨刬d鐩稿悓銆?涓嶅垢鐨勬槸錛屾鏃禼at鐨刬d琚祴涓簄ull錛屽紓甯歌鎶涘嚭錛岀▼搴忕粓姝紙姝ゅ瑕佹敞鎰忥紝鎴戜滑鍦ㄤ互鍚庣殑寮鍙戣繃紼嬪敖閲忎笉瑕佸湪flush涔嬪墠鏀瑰彉宸茬粡榪涜浜嗘搷浣滅殑瀵硅薄 鐨刬d錛夈?
榪欎釜渚嬪瓙涓殑閿欒涔熸槸鐢變簬緙撳瓨鐨勫歡鏃舵洿鏂伴犳垚鐨勶紙褰撶劧錛屼笌涓嶆瑙勭殑浣跨敤Hibernate涔熸湁鍏崇郴錛夛紝澶勭悊鏂規(guī)硶鏈変袱縐嶏細
1銆佸湪錛?錛変箣鍚巉lush錛岃繖鏍峰氨鍙互淇濊瘉錛?0錛夊save灝哻at浣滀負涓涓叏鏂扮殑瀵硅薄榪涜淇濆瓨銆?
2銆佸垹闄わ紙9錛夛紝榪欐牱絎簩嬈ave鎵寮曡搗鐨勫己鍒秄lush鍙互姝e父鐨勬墽琛岋紝鍦ㄦ暟鎹簱涓彃鍏at瀵硅薄鍚庡皢鍏跺垹闄わ紝鐒跺悗緇х畫絎簩嬈ave閲嶆柊鎻掑叆cat瀵硅薄錛屾鏃禼at鐨刬d浠嶄笌浠庡墠涓鑷淬?br /> 榪欎袱縐嶆柟娉曞彲浠ユ牴鎹笉鍚岀殑闇瑕佹潵浣跨敤錛屽懙鍛碉紝鎬昏寰楀ソ鍍忔槸寰堜笉姝h鐨勬柟寮忔潵瑙e喅闂錛屼絾鏄棶棰樻湰韜篃涓嶅姝h錛屽彧甯屾湜鑳藉鍦ㄥ簲鐢ㄥ紑鍙戜腑緇欏ぇ瀹朵竴浜涘府鍔╋紝涓嶅鐨勫湴鏂逛篃甯屾湜鍚勪綅緇欎笌鎸囨銆?br /> 銆銆鎬葷殑鏉ヨ錛岀敱浜嶩ibernate鐨刦lush澶勭悊鏈哄埗錛屾垜浠湪涓浜涘鏉傜殑瀵硅薄鏇存柊鍜屼繚瀛樼殑榪囩▼涓氨瑕佽冭檻鏁版嵁搴撴搷浣滈『搴忕殑鏀瑰彉浠ュ強寤舵椂flush鏄?鍚﹀紼嬪簭鐨勭粨鏋滄湁褰卞搷銆傚鏋滅‘瀹炲瓨鍦ㄧ潃褰卞搷錛岄偅灝卞彲浠ュ湪闇瑕佷繚鎸佽繖縐嶆搷浣滈『搴忕殑浣嶇疆鍔犲叆flush寮哄埗Hibernate灝嗙紦瀛樹腑璁板綍鐨勬搷浣渇lush鍏?鏁版嵁搴擄紝榪欐牱鐪嬭搗鏉ヤ篃璁鎬笉澶編瑙傦紝浣嗗緢鏈夋晥銆?/div>
杞?
]]>
]]>
鍦╤ibernate鐨勬搷浣滀腑錛岀壒鍒槸涓諱粠鏁版嵁鐨勬搷浣溿?br />
涓鑸湁榪欎箞鍑犱釜鍦版柟闇瑕佹敞鎰忥紝浠ュ墠涔熶竴鐩存病鏈夋嬁hibernate濂藉ソ鐢ㄨ繃錛岀幇鍦ㄧ湡姝g敤璧鋒潵錛岄棶棰樿繕鏄尯澶氫簡銆傝繖鍑犲ぉ涓鐩村湪璋冭瘯瑙i噴榪欑闂銆?br />
涓繪暟鎹腑鐨勪竴瀵逛竴鍏寵仈錛岃繖閲岀殑鍏寵仈鏁版嵁浠庨〉闈㈡彁浜ょ殑鏃跺欐槸鍚﹀彲浠ョ洿鎺ユ槧灝勫埌涓繪暟鎹璞′腑錛熸殏鏃朵笉娓呮錛屽彲浠ユ祴璇曚竴涓嬨?br />
鐒跺悗鏄槑緇嗘暟鎹殑鎿嶄綔錛岀幇鍦ㄥ姩鎬佷駭鐢熺殑琛屾暟鎹紝鐒跺悗鎵嬪姩瑙f瀽錛岀敓鎴愭槑緇嗗璞°傛暣涓繃紼嬩釜浜烘劅瑙夋瘮杈冮夯鐑︼紝鏆傛椂涔熸兂涓嶅嚭鏈変粈涔堝ソ鐨勮В鍐蟲柟妗堛?br />
榪欓噷鍦ㄧ駭鑱斾繚瀛樻暟鎹殑鏃跺欙紝棣栧厛瑕佹竻闄ゆ帀鍘熸潵鐨勬槑緇嗘暟鎹紝鐒跺悗鍐嶆妸欏甸潰鎻愪氦榪囨潵鐨勬暟鎹姞涓娿?br />
涓嶇煡閬撲竴鑸槸涓嶆槸榪欐牱寮勭殑銆傚惁鍒欐病娉曟竻妤氬師鏉ョ殑鏁版嵁銆?br />
]]>
鐜板湪鍞竴鍙戠幇鐨勫尯鍒氨鏄紝@Transient闈炴寔涔呭寲鍩熺殑涓嶅悓銆?br />
鏀懼湪鏂規(guī)硶涓婏紝鍙渶瑕佹爣璁伴偅涓猤etter鏂規(guī)硶鍗沖彲錛屽彲浠ユ病鏈夊搴斿睘鎬с?br />
濡傛灉鏀懼湪灞炴т笂錛岄渶瑕佺敓鎴恎etter 鍜宻etter鏂規(guī)硶