21

我正在开发一个小型应用程序,我正在尝试使用 Hibernate Annotations 来映射我的实体。当我遇到这个异常时,我想测试一切是否正常:

    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

有人能解释一下这个例外是什么吗?这是我第一次看到它。这是我的应用程序的主要内容:

 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();
     }
 }

}

我的休眠配置非常简单:

    <!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 依赖项:

<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>

有人能帮助我吗 ??

4

6 回答 6

28

这意味着在某些时候, aninterface被更改为 a class,但原始接口的实现者没有被修改和重新编译以适应这种(不兼容的)更改。

例如,考虑以下类型:

interface Fooable {
  void foo();
}

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

现在假设Fooable被修改并重新编译,FooImpl不是:

abstract class Fooable {
  public abstract void foo();
}
于 2010-08-20T21:08:24.317 回答
4

JDK 1.4 支持已在 3.6 中删除。所以 Hibernate Annotations 已经合并回 Core 并且不再需要同时拥有ConfigurationandAnnotationConfiguration和后者不应该在 3.6.x 中使用(实际上,你可能应该使用 JPA EntityManager,而不是核心 API,但这是另一个故事)。

但我真正的建议是使用 Hibernate 的3.5.x分支,而不是 3.6.x。正如我们已经看到的,Hibernate 团队在 3.6 中引入了很大的变化,这是在 Beta 版的基础之上,除非你密切关注这些变化,否则你会面临一些惊喜并且在 Internet 上找不到很多资源然而。只需使用 Hibernate 3.5(撰写本文时为 3.5.5-Final)。

于 2010-08-21T09:12:01.723 回答
3

仔细检查您的所有库是否兼容。尝试使用 hibernate 的稳定版本,有可能是 beta 有缺陷,或者 hibernate 3.6.0 beta POM 有一些不兼容的依赖项。

尝试在没有 maven 的情况下使用来自官方服务器的 hibernate 3.6.0 beta1 库来构建它。


好的 - 您的问题不是错误,而是新功能。Hibernate 3.6.0 Beta2 的发行说明指出了对先前 beta 的重大更改:AnnotationConfiguration 现在已完全弃用。因此,如果您想保留 3.6.0 版本,您应该 (a) 更新到最新的 beta (Beta3),并且 (b) 不要继续使用 AnnotationConfiguration。

于 2010-08-20T21:30:08.227 回答
2

是的,埃里克森正确地发现了这个问题。

这很可能是由于类路径中有相同类型定义的两个冲突版本造成的。例如,library-version2.jar 定义了一些东西,但您的类路径中也有 library-version5.jar。

在运行时,这会导致埃里克森描述的痛苦和折磨。

于 2010-08-20T21:11:40.607 回答
1

我写这篇文章是为了帮助查找这个错误的人。有时来自 Spring Roo 的 jar 文件会生成 pom.xml 和 Tomcat 服务器运行时库冲突,并在单元测试期间产生此错误。在构建像 Flex 这样的前端技术时,服务器运行时库不需要出现在类路径中,因此只需从类路径中删除服务器运行时库。

于 2011-05-05T07:25:17.013 回答
0

您使用的是哪个应用程序服务器?可能是重复或冲突的休眠 jar。

于 2010-08-20T21:04:36.287 回答