2010-08-20 12 views
17

मैं एक छोटे से आवेदन पर काम कर रहा हूं और मैं अपनी संस्थाओं को मैप करने के लिए हाइबरनेट एनोटेशन का उपयोग करने की कोशिश कर रहा हूं। मैं यह जांचना चाहता था कि जब मुझे यह अपवाद मिला तो सब कुछ ठीक है:जावा में एक असंगत क्लासChangeError अपवाद क्या है?

Exception in thread "main" java.lang.ExceptionInInitializerError 
at fr.cc2i.intervention.dao.main.Main$HibernateUtil.<clinit>(Main.java:48) 
at fr.cc2i.intervention.dao.main.Main.test(Main.java:21) 
at fr.cc2i.intervention.dao.main.Main.main(Main.java:32) 
Caused by: java.lang.IncompatibleClassChangeError: Implementing class 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:616) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) 
at java.net.URLClassLoader.access$000(URLClassLoader.java:58) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:197) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
at fr.cc2i.intervention.dao.main.Main$HibernateUtil.<clinit>(Main.java:44) 
... 2 more 

क्या कोई यह अपवाद बता सकता है? यह पहली बार है जब मैं इसे देखता हूं। यहाँ अपने आवेदन के मुख्य है:

<properties> 
     <org.springframework.version>3.0.3.RELEASE</org.springframework.version> 
     <hibernate.version>3.6.0.Beta1</hibernate.version></properties> 

    <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>${hibernate.version}</version> 
      <type>jar</type> 
      <scope>compile</scope> 
     </dependency> 

कोई मदद कर सकते हैं:

<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
<session-factory> 
    <!-- Database connection settings --> 
    <property name="connection.driver_class">org.hsqldb.jdbcDriver</property> 
    <property name="connection.url">jdbc:hsqldb:hsql://localhost</property> 
    <property name="connection.username">sa</property> 
    <property name="connection.password"></property> 

    <!-- JDBC connection pool (use the built-in) --> 
    <property name="connection.pool_size">1</property> 

    <!-- SQL dialect --> 
    <property name="dialect">org.hibernate.dialect.HSQLDialect</property> 

    <!-- Enable Hibernate's automatic session context management --> 
    <property name="current_session_context_class">thread</property> 

    <!-- Disable the second-level cache --> 
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

    <!-- Echo all executed SQL to stdout --> 
    <property name="show_sql">true</property> 

    <!-- Drop and re-create the database schema on startup --> 
    <property name="hbm2ddl.auto">update</property> 

    <mapping package="fr.cc2i.intervention.dao.beans.Client" /> 
    <mapping class="fr.cc2i.intervention.dao.beans.Contrat" /> 
    <mapping class="fr.cc2i.intervention.dao.beans.Intervention" /> 
    <mapping class="fr.cc2i.intervention.dao.beans.Technicien" /> 



</session-factory> 
</hibernate-configuration> 

यहाँ हाइबरनेट Maven निर्भरता मैं उपयोग कर रहा हूँ है:

package fr.cc2i.intervention.dao.main; 

import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.AnnotationConfiguration; 

import fr.cc2i.intervention.dao.beans.Client; 
import fr.cc2i.intervention.dao.beans.Contrat; 

public class Main { 

public static void test(){ 
    Client c = new Client(); 
    c.setCode("123343"); 
    c.setAdresse("fkhdhdmh"); 
    c.setNom("dgsfhgsdfgs"); 
    c.setPhone("53456464"); 
    c.setContrat(new Contrat()); 

    Session session = HibernateUtil.getSession(); 
     session.beginTransaction();   
     session.save(c); 
     session.getTransaction().commit(); 

} 

/** 
    * @param args 
    */ 
public static void main(String[] args) { 
    Main.test(); 

} 

public static class HibernateUtil { 

private static final SessionFactory sessionFactory; 
    static { 
     try { 
      sessionFactory = new AnnotationConfiguration() 
        .configure().buildSessionFactory(); 
     } catch (Throwable ex) { 
      // Log exception! 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static Session getSession() 
      throws HibernateException { 
     return sessionFactory.openSession(); 
    } 
} 

} 

मेरे हाइबरनेट config बहुत सरल है कृपया मुझे ??

+0

[डुप्लिकेट नहीं बल्कि इस त्रुटि के बारे में एक और सवाल] (http://stackoverflow.com/questions/1980452/what-causes-java-lang-incompatibleclasschangeerror) –

उत्तर

25

इसका मतलब है कि किसी बिंदु पर, interface को class में बदल दिया गया था, लेकिन मूल इंटरफ़ेस का एक कार्यान्वयन संशोधित नहीं किया गया था और इस (असंगत) परिवर्तन को समायोजित करने के लिए पुन: संकलित किया गया था।

उदाहरण के लिए, निम्नलिखित प्रकार पर विचार करें:

interface Fooable { 
    void foo(); 
} 

class FooImpl implements Fooable { 
    public void foo() { 
    /* Do something... */ 
    } 
} 

अब मान लीजिए Fooable संशोधित और फिर कंपाइल है, लेकिन FooImpl नहीं है:

abstract class Fooable { 
    public abstract void foo(); 
} 
+0

हाय, आपके उत्तर के लिए धन्यवाद। इसे कैसे हल किया जा सकता है?? – Dimitri

+3

रुको, यह सिर्फ * एक * संभावित कारण है। स्थिर क्षेत्रों से गैर स्थैतिक या इसके विपरीत क्षेत्रों को बदलने की तरह। [यहां देखें।] (Http://stackoverflow.com/questions/1980452/what-causes-java-lang-incompatibleclasschangeerror/1980474#1980474) –

+4

@Andreas_D - संदेश के साथ नहीं, "कार्यान्वयन वर्ग"। यह मेरी समस्या का वर्णन करने के लिए विशिष्ट है। – erickson

0

आप किस एप्लिकेशन सर्वर का उपयोग कर रहे हैं? एक डुप्लिकेट या विरोधाभासी हाइबरनेट जार हो सकता है।

+0

कोई एप्लिकेशन सर्वर नहीं। – Dimitri

2

ठीक है, एरिक्सन मुद्दा सही ढंग से पहचान की है।

यह संभवतः आपके क्लासपाथ में एक ही प्रकार की परिभाषा के दो विरोधाभासी संस्करण होने के कारण होता है। उदाहरण के लिए, लाइब्रेरी-वर्जन 2.जर कुछ सामान को परिभाषित करता है, लेकिन आपके क्लासपाथ में लाइब्रेरी-वर्जन 5.जर भी है।

रनटाइम पर, दर्द और पीड़ा के परिणामस्वरूप एरिक्सन का वर्णन होता है।

3

यदि आपके सभी पुस्तकालय संगत हैं तो दो बार जांचें। हाइबरनेट के स्थिर संस्करण के साथ इसे आज़माएं, बीटा दोषपूर्ण है या हाइबरनेट 3.6.0 बीटा पीओएम में कुछ असंगत निर्भरताएं हैं।

आधिकारिक सर्वर से 3.6.0 बीटा 1 पुस्तकालयों के बिना इसे मेवेन के बिना और हाइबरनेट के निर्माण के लिए प्रयास करें।


ठीक है - आपकी समस्या एक बग लेकिन एक नई सुविधा नहीं है। हाइबरनेट 3.6.0 बीटा 2 के रिलीज नोट्स पिछले बीटा में एक बड़ा बदलाव नोट करते हैं: the AnnotationConfiguration is now totally deprecated। इसलिए यदि आप 3.6.0 संस्करण रखना चाहते हैं और (बी) एनोटेशन कॉन्फ़िगरेशन का उपयोग जारी नहीं रखना चाहते हैं तो आपको (ए) सबसे हालिया बीटा (बीटा 3) में अपडेट करना चाहिए।

4

जेडीके 1.4 समर्थन 3.6 में गिरा दिया गया है। तो हाइबरनेट एनोटेशन को कोर में वापस विलय कर दिया गया है और Configuration और AnnotationConfiguration दोनों के लिए और आवश्यकता नहीं है और बाद में 3.6.x में उपयोग नहीं किया जाना चाहिए (वास्तव में, आपको शायद जेपीए EntityManager का उपयोग करना चाहिए, कोर एपीआई नहीं, लेकिन यह एक और कहानी है)।

लेकिन मेरी वास्तविक सलाह 3.5.x हाइबरनेट की शाखा का उपयोग करना होगा, 3.6.x. नहीं। जैसा कि हमने पहले ही देखा है, हाइबरनेट टीम 3.6 में बड़े बदलाव पेश कर रही है, जो अभी भी बीटा में है, और जब तक आप बारीकी से बदलावों का पालन नहीं कर रहे हैं, तो आपको कुछ आश्चर्य का सामना करना पड़ेगा और इंटरनेट पर कई संसाधन नहीं पाएंगे अभी तक। बस हाइबरनेट 3.5 का उपयोग करें (इसे लिखने के समय 3.5.5-फ़ाइनल)।

+0

आपकी टिप्पणी के लिए धन्यवाद। हाल ही में वेबस्पेयर से जेबॉस तक माइग्रेट की गई एक विरासत परियोजना पर, मैं इंटरफेस 'org.primitive.type.PrimitiveType' (कस्टम हाइबरनेट' उपयोगकर्ता टाइप 'में) के उपयोग के कारण इस' असंगत क्लास चेंज एरर' के माध्यम से आया था) जो संस्करण से पहले एक अमूर्त वर्ग था 3.6। लेकिन समस्या यह है कि कई pom.xml अलग-अलग हाइबरनेट निर्भरताएं हैं, जैसे 3.3.2.GA बनाम 3.6.10. अंतिम। – maxxyme

1

मैं इसे इस त्रुटि को देखने में मदद करने के लिए लिखता हूं। कभी-कभी स्प्रिंग रू से आने वाली जार फाइलें pom.xml और टॉमकैट सर्वर रनटाइम लाइब्रेरीज़ उत्पन्न होती हैं और यूनिट परीक्षण के दौरान इस त्रुटि का उत्पादन करती हैं। फ्लेक्स जैसी फ्रंटेंड तकनीक का निर्माण करते समय, क्लासपाथ में सर्वर रनटाइम लाइब्रेरी को प्रस्तुत करने के लिए आवश्यक नहीं है, इसलिए क्लासपाथ से सर्वर रनटाइम लाइब्रेरी को हटा दें।

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