सही उत्तर निम्नलिखित कथन का उपयोग करना होगा:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB);
हालाँकि तब समस्या यह प्रकट होती है कि एक बार अपडेट स्टेटमेंट करने के बाद, हाइबरनेट को ऑटो-इंक्रीमेंट वैल्यू वापस नहीं मिली।
मुझे निम्नलिखित ब्लॉग पोस्ट मिली (http://www.jroller.com/mmatthews/entry/ get_hibernate_and_mysql_s ) और क्वेरी को निम्न में संशोधित किया:
INSERT INTO table (colA, colB) VALUES (?,?) ON DUPLICATE KEY
UPDATE colB = VALUES(colB), id = LAST_INSERT_ID(id);
जो अंत में काम करता है।
इस दृष्टिकोण के साथ एक अनसुलझी समस्या यह है कि एक ही लेन-देन के भीतर समान दो संस्थाओं का सम्मिलन काम नहीं करता है। यहां तक कि अगर दूसरी प्रविष्टि सही अद्यतन का कारण बनती है, तो एम 2 इकाई-उदाहरणों के साथ समाप्त हो जाएगा जो एक ही डेटाबेस पंक्ति का प्रतिनिधित्व करते हैं - जिसकी अनुमति नहीं है।
इसे हल करने के लिए, किसी को केवल यह सुनिश्चित करने की आवश्यकता है कि आप 2 संस्थाओं को सम्मिलित न करें जो उनकी बाधाओं के कारण समान रूप से प्रदान की जाती हैं। (मैंने समान/हैशकोड के लिए समान तर्क का उपयोग समग्र-अद्वितीय-कुंजी बाधा के रूप में किया था, इसलिए मैं बैच-आवेषण करते समय ऐसे डुप्लिकेट को समाप्त करने में सक्षम हूं)