एक MySQL AUTO_INCREMENT का उपयोग करने के लिए कॉलम, आपको एक IDENTITY का उपयोग करना चाहिए रणनीति:
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
AUTO . का उपयोग करने पर आपको यही मिलेगा MySQL के साथ:
@Id @GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
जो वास्तव में
. के बराबर है@Id @GeneratedValue
private Long id;
दूसरे शब्दों में, आपकी मैपिंग काम करनी चाहिए। लेकिन हाइबरनेट को id को छोड़ देना चाहिए SQL सम्मिलित कथन में कॉलम, और यह नहीं है। कहीं न कहीं एक तरह का बेमेल होना चाहिए।
क्या आपने अपने हाइबरनेट कॉन्फ़िगरेशन में एक MySQL बोली निर्दिष्ट की थी (शायद MySQL5InnoDBDialect या MySQL5Dialect आपके द्वारा उपयोग किए जा रहे इंजन के आधार पर)?
इसके अलावा, तालिका किसने बनाई? क्या आप संबंधित डीडीएल दिखा सकते हैं?
अनुवर्ती: मैं आपकी समस्या का पुनरुत्पादन नहीं कर सकता। आपके . के कोड का उपयोग करना इकाई और आपका डीडीएल, हाइबरनेट MySQL के साथ निम्नलिखित (अपेक्षित) SQL उत्पन्न करता है:
insert
into
Operator
(active, password, username)
values
(?, ?, ?)
ध्यान दें कि id जैसा कि अपेक्षित था, उपरोक्त कथन से कॉलम अनुपस्थित है।
संक्षेप में, आपका कोड, तालिका परिभाषा और बोली सही और सुसंगत हैं, इसे काम करना चाहिए। यदि यह आपके लिए नहीं है, तो हो सकता है कि कुछ सिंक से बाहर हो (एक साफ निर्माण करें, बिल्ड निर्देशिका को दोबारा जांचें, आदि) या कुछ और गलत है (कुछ भी संदिग्ध के लिए लॉग जांचें)।
बोली के संबंध में, केवल MySQL5Dialect . के बीच अंतर या MySQL5InnoDBDialect क्या यह बाद में ENGINE=InnoDB adds जोड़ता है डीडीएल उत्पन्न करते समय तालिका वस्तुओं के लिए। एक या दूसरे का उपयोग करने से उत्पन्न SQL नहीं बदलता है।