2010-03-26 21 views
8

मुझे जावा डबल डेटाटाइप में ओरेकल फ्लोट डबल परिशुद्धता डेटाटाइप के मैपिंग के साथ समस्या है। हाइबरनेट स्कीमा सत्यापनकर्ता विफल रहता है जब जावा डबल डेटाटाइप का उपयोग किया जाता है।हाइबरनेट: मिला: फ्लोट, अपेक्षित: डबल परिशुद्धता

org.hibernate.HibernateException: Wrong column type in DB.TABLE for column amount. Found: float, expected: double precision 

इससे बचने का एकमात्र तरीका स्कीमा सत्यापन को अक्षम करना है और उम्मीद है कि स्कीमा चलाने के बारे में ऐप के साथ समन्वयित है। यह उत्पादन से बाहर होने से पहले तय किया जाना चाहिए।

एप्लिकेशन की evironment:
- Grails 1.2.1
- हाइबरनेट कोर 3.3.1.GA
- Oracle 10g

+1

क्या आप दिखा सकते हैं कि आप वास्तव में इस कॉलम को कैसे मैप करते हैं? बीटीडब्ल्यू ने यह नोट करके कि आप उत्पादन में जाने से पहले आखिरी मिनट में हैं, आप बस अपने ऐप का परीक्षण करने के लिए अपनी नींद के बारे में विनोदी टिप्पणी प्राप्त करना सुनिश्चित करें :-) –

+0

हाहा :) चिंता न करें, मैं मैला नहीं हूँ जब उत्पादन सामग्री की बात आती है। जब तक यह तय नहीं किया जाता है तब तक यह बाहर नहीं जाएगा। वैसे भी, यह मेरे सह-कार्यकर्ता में से एक बग है और मैं बस उसकी मदद करने की कोशिश कर रहा हूं। हालांकि अच्छी टिप्पणी :) –

+0

मैंने आपके सुझाव के अनुसार अपना प्रश्न संपादित किया। धन्यवाद। –

उत्तर

4

अधिक जानकारी की आवश्यकता है। टेबल डबल है? मैं ओरेकल से परिचित नहीं हूं, लेकिन क्या यह एक फ़्लोटिंग पॉइंट प्रकार है? java.sql.Types किस प्रकार का अनुवाद करता है? आप अपने डेटाबेस के लिए बोली वर्ग में डेटाबेस प्रकार मैपिंग के लिए java.sql.Types देख सकते हैं। इस मामले में यह org.hibernate.dialect.Oracle10gDialect है (जो 9i और 8i तक फैला हुआ है)। ऐसा लगता है कि

registerColumnType(Types.DOUBLE, "double precision"); 

तो, तालिका double precision के रूप में परिभाषित करने की आवश्यकता है, और जावा वर्ग कुछ है कि Types.Double, आमतौर पर double करने के लिए नक्शे होगा के रूप में परिभाषित किया जाना चाहिए।

त्रुटि संदेश से, यह की तरह अपनी मेज float जो इस मानचित्रण

registerColumnType(Types.FLOAT, "float"); 

जिसके लिए उम्मीद जावा प्रकार कुछ है कि Types.FLOAT, आमतौर पर float को नक्शे होगा का प्रयोग करेंगे के रूप में परिभाषित किया गया है लग रहा है, एक सटीक मूल्य।

सबसे आसान काम करने के लिए या तो अपनी तालिका या जावा क्लास को मिलान करने के लिए बदलना है। वैकल्पिक रूप से, आप एक उपयोगकर्ता प्रकार निर्दिष्ट कर सकते हैं जो एक एकल परिशुद्धता मान को एक डबल परिशुद्धता मान पर मैप करेगा; मैं नहीं सोच सकता कि आप वास्तव में ऐसा क्यों करना चाहते हैं, लेकिन हो सकता है कि यदि आपके पास कक्षा और तालिका दोनों पर नियंत्रण नहीं था, जो कि काफी दुर्लभ है, तो मुझे लगता है।

hth।

1

हमारे पास एक ही समस्या थी। हम स्पष्ट रूप से इस तरह, मानचित्रण में स्तंभ प्रकार सेट करने के लिए यह सुनिश्चित करते हुए इसे हल:

<property name="performance" type="double"> 
    <column name="PERFORMANCE" sql-type="float" /> 
</property> 
0

मैं एक मामला था, जहां मेरे ओरेकल स्तंभ प्रकार NUMBER था और जावा प्रकार double था।

अंत में पता लगाया है कि यह सेटिंग्स

<property name="hbm2ddl.auto">validate</property>

करने के लिए नीचे था सिर्फ

<property name="hbm2ddl.auto">update</property>

और सब कुछ काम किया यह बदल गया है!

7

जब तक आप डीडीएल फ़ाइल में double precision के रूप में कॉलम प्रकार को परिभाषित नहीं करते हैं, तो ओरेकल इसे float कॉलम प्रकार में परिवर्तित कर देगा। तो आपको बोली कक्षा में फ्लोट कॉलम प्रकार के रूप में डबल पंजीकरण करने की आवश्यकता है।

public class Oracle10gDialectExtended extends Oracle10gDialect { 

    public Oracle10gDialectExtended() { 
     super(); 
     registerColumnType(Types.DOUBLE, "float"); 
    } 
} 

अंत में hibernate.dialect के रूप में हाइबरनेट/जेपीए विन्यास में Oracle10gDialectExtended रजिस्टर।

0

मुझे यह समस्या थी जब jboss 4/hibernate 3 ऐप को as7/hibernate4 में माइग्रेट करते समय। रॉब केलिटी के एचबीएम 2ddl.auto को विरासत कोड बदलने के बिना अद्यतन करने के लिए अद्यतन करने के सुझाव से हल समस्या।

3

यदि आप एनोटेशन विधि का उपयोग कर रहे हैं, तो आपको फ़ील्ड के लिए नीचे कॉलम प्रकार घोषित करने की आवश्यकता है।

@Column(name = "PERFORMANCE", columnDefinition = "FLOAT(5,2)") 
private double performance; 
संबंधित मुद्दे