2011-10-11 10 views
5

के साथ संशोधितडेटा टाइप रीफैक्टरिंग का उपयोग करके BIGINT में एक आईएनटी ऑटोइनक्रिकमेंट कॉलम बदलें, मेरे पास एक प्राथमिक कुंजी कॉलम है जो एक आईएनटी कॉलम है जिसे मैं बिगिनट में बदलना चाहता हूं। हमारा परीक्षण और उत्पादन पर्यावरण MySQL का उपयोग करता है, लेकिन यूनिट परीक्षणों के लिए हम एम्बेडेड एच 2 डेटाबेस का उपयोग करते हैं।लिक्विबेस: H2 डेटाबेस

मैं निम्नलिखित Liquibase रिफैक्टरिंग बनाया है:

... 
<changeSet id="1" author="trond"> 
    <modifyDataType tableName="event" columnName="id" newDataType="BIGINT" /> 
    <rollback> 
     <modifyDataType tableName="event" columnName="id" newDataType="INT" /> 
    </rollback> 
</changeSet> 
... 

रिफैक्टरिंग काम करता है, लेकिन जब मैं डेटाबेस हाइबरनेट का उपयोग करने के लिए एक वस्तु बने रहने की कोशिश करते हैं, मैं निम्न त्रुटि संदेश (मैं त्रुटि लपेटा गया है मिल संदेश):

ERROR org.hibernate.util.JDBCExceptionReporter [main]: NULL not allowed for column "ID"; 
    SQL statement: insert into event (id, eventtime, guid, meta, objectguid, originatorid, subtype, type) values (null, ?, ?, ?, ?, ?, ?, '0') [90006-140] 

JDBC exception on Hibernate data access: 
    SQLException for SQL [insert into event (id, eventtime, guid, meta, objectguid, originatorid, subtype, type) values (null, ?, ?, ?, ?, ?, ?, '0')]; 
    SQL state [90006]; error code [90006]; could not insert: [event.MyEvent]; 
    nested exception is org.hibernate.exception.GenericJDBCException: could not insert: [event.MyEvent] 

MyEvent वर्ग एक AbstractBaseEvent जो कोड में निम्नलिखित हाइबरनेट मानचित्रण परिभाषित किया गया है से विरासत:

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private long id; 

कुछ अंक:

  • हाइबरनेट मानचित्रण डेटा प्रकार की पुनर्रचना से पहले काम करता है
  • Liquibase का संस्करण 2.0.1
  • किया जाए या नहीं इस के साथ MySQL अभी तक परीक्षण नहीं किया गया काम करता है

उत्तर

6

मैं परीक्षण किया (हाइबरनेट 3.6.2.Final, एच 2 1.3.160, बोली: org.hibernate.dialect.H2Dialect) क्या अपने मामले में हो रहा है:

  • ऑटो और डेटा प्रकार है जब GenerationType है INT, वास्तविक पीढ़ी प्रकार SEQUENCE है।
  • जब जेनरेशन टाइप ऑटो है और डेटा प्रकार बिगिनट है, वास्तविक पीढ़ी का प्रकार पहचान है। नतीजतन यह असफल हो जाएगा, यदि आईडी-फ़ील्ड आईडी बिगिनट प्राथमिक कुंजी के रूप में परिभाषित किया गया है और आईडी बिगिनट पहचान के रूप में नहीं है (H2 के साथ प्राथमिक कुंजी यहां अनावश्यक होगी)।

आप क्या कर सकते हैं:

आप वास्तविक पीढ़ी प्रकार अनुक्रम होना चाहते हैं, के रूप में पहले, तो

@GeneratedValue(strategy = GenerationType.SEQUENCE) 

काम करने के लिए लगता है। अनुक्रम के लिए कोई बदलाव आवश्यक नहीं है, क्योंकि documentation प्रकार के अनुसार बिगिनट है। मैं इस तरह से करता हूं, क्योंकि तब कुछ भी वास्तव में नहीं बदलता है और यह स्पष्ट है कि किस तरह से अनुक्रम उत्पन्न होता है

अन्य संभावना कॉलम को प्रारंभ वैल्यू (संभावित मौजूदा मानों के कारण) के साथ पहचान के रूप में परिभाषित करना है और पहले जेनरेशन टाइप। ऑटो का उपयोग करना है।

+0

बहुत अच्छा विश्लेषण - धन्यवाद। SEQUENCE का उपयोग करने के साथ मैं एकमात्र समस्या देखता हूं कि MySQL अनुक्रमों का समर्थन नहीं करता है। एक विकल्प अनुक्रम तालिका का उपयोग करना है जिसे हमने किसी अन्य मामले में उपयोग किया है। – tronda

+0

अच्छा विचार - तालिका का उपयोग करना सबसे पोर्टेबल है वैसे भी। –

+0

यदि पोर्टेबिलिटी आपकी चिंता है, तो मूल रूप से कोई सवाल नहीं है: आपको '@ TableGenerator' का उपयोग करना होगा। –

1

मैं पहली बार बदल जाएगा आपके @GenerationType विशिष्ट कुछ (जैसे IDENTITY) बस हाइबरनेट एक दृश्य से अजीब मूल्यों हो रही के साथ कोई समस्या बाहर शासन करने के लिए करने के लिए। या इसे पूरी तरह से हटा दें।

आपका रिफैक्टरिंग ठीक दिखता है, और मुझे कोई स्पष्ट समस्या नहीं दिखाई दे रही है।

एच 2 और लिक्विबेस अक्सर उद्धृत पहचानकर्ताओं की बात करते समय अच्छी तरह से एक साथ नहीं खेलते हैं; Liquibase में एच 2 डेटाबेस वर्ग कुछ उद्धरण देता है और दूसरों को उद्धृत नहीं करता है। शायद मामला रूपांतरण आपको खराब कर रहा है?

EclipseLink कभी कभी समस्या नहीं है जब एक आदिम प्रकार 0 है (!) के बाद से यह कभी कभी null या अप्रारंभीकृत, लेकिन मेरी जानकारी हाइबरनेट के रूप में इस तरह के एक मूल्य के व्यवहार करेगा इस सीमा से ग्रस्त नहीं है।

यह वास्तव में एक उत्तर नहीं है, मुझे पता है, लेकिन उम्मीद है कि आपको सही दिशा में इंगित करना चाहिए।

संबंधित मुद्दे