तो आप चाहते हैं:
User u1 = new User("Bill");
session.save(u1);
User u2 = new User("Bill");
session.saveOrUpdate(u2);
कि U1 और U2 सूचना के लिए एक ही बिल रहे हैं और केवल एक बार की दुकान? हाइबरनेट को यह जानने का कोई तरीका नहीं है कि बिल एक ही व्यक्ति हैं। यह केवल यूजर यू 2 की आईडी को देखता है, यह देखता है कि यह सेट नहीं है, निष्कर्ष निकाला है कि यू 2 डाला जाना चाहिए, कोशिश करता है और अपवाद की रिपोर्ट करता है।
SaveOrUpdate वर्तमान में सत्र से जुड़ा हुआ एक पूरी तरह से नई वस्तु और एक लोड ऑब्जेक्ट दोनों बनी हुई है। तो यह काम करता है (यह मानते हुए कि आप एक findByName विधि कहीं और वहाँ एक और विशेषता है, के favoriteColor मान लीजिए):
User u1 = new User("Bill");
u1.setFavoriteColor("blue");
session.saveOrUpdate(u1);
User u2 = findByName("Joe");
u2.setFavoriteColor("red");
session.saveOrUpdate(u2);
लेकिन है कि आप क्या चाहते हैं, सही नहीं है?
आपकी समस्या एक सरोगेट प्राथमिक कुंजी और अलग से, एक व्यापार कुंजी (एक विशिष्टता बाधा के माध्यम से लागू) होने के कारण आपकी इकाई से भी बदतर हो गई है। आप एक आईडी क्षेत्र आपके पास नहीं था और केवल प्राथमिक कुंजी के रूप नाम, आप (मर्ज बनाम saveOrUpdate की चर्चा के लिए, look here) मर्ज() इस्तेमाल कर सकते हैं:
User u1 = new User("Bill");
u1.setFavoriteColor("blue");
session.save(u1);
User u2 = new User("Bill");
u2.setFavoriteColor("red");
u2 = session.merge(u2);
लेकिन आपको लगता है कि नहीं है, आप आईडी पर पीके बाधा और नाम पर विशिष्टता दोनों को लागू करने की आवश्यकता है। तो आपको विलय के कुछ बदलाव की आवश्यकता होगी जो ऐसा करता है।
public User mergeByName(User user) {
User merged;
User candidate = findByName(user.getName());
if (candidate != null) {
user.setId(candidate.getId());
merged = session.merge(user);
} else {
session.save(user);
merged = user;
}
return merged;
}
आपके भरोसेमंद के लिए Thx। 'id' प्राथमिक कुंजी है और 'नाम' में अद्वितीय constriant हमारे पास ऑब्जेक्ट क्लास उपयोगकर्ता है उदाहरण के लिए: ' उपयोगकर्ता बिल = नया उपयोगकर्ता() 'और बिल के बारे में विशेषताएँ जो हम कीबार्ड या वेबसाइट से प्राप्त करते हैं, और मेरा प्रश्न है : आप saveOrUpdate() का अर्थ कैसे बना सकते हैं यदि बिल.नाम डीबी में मौजूद है तो हम अपडेट कहते हैं() अन्यथा हम बिल को सहेजते हैं। – kunkanwan