i am working on a small application and I am trying to use Hibernate Annotations to map my entities. I wanted to test if everything is alright when i got this exception :
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
Can someone explain what is this exception ? This is the first time i see it. Here is the main of my application :
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();
}
}
}
My hibernate config is very simple :
<!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>
Here is the hibernate maven dependency i am using :
<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>
Can someone help me please ??
Это означает, что в какой-то момент интерфейс
был изменен на класс
, но реализатор исходного интерфейса не был модифицирован и перекомпилирован с учетом этого (несовместимого) изменения.
Например, рассмотрим следующие типы:
interface Fooable {
void foo();
}
class FooImpl implements Fooable {
public void foo() {
/* Do something... */
}
}
Теперь предположим, что Fooable
изменен и перекомпилирован, но FooImpl
является не :
abstract class Fooable {
public abstract void foo();
}
Какой сервер приложений вы используете? Это может быть повторяющаяся или конфликтующая банка гибернации.
Поддержка JDK 1.4 была прекращена в версии 3.6. Итак, Hibernate Annotations были объединены обратно в Core, и больше нет необходимости иметь одновременно Configuration
и AnnotationConfiguration
, а более поздние версии не должны использоваться в 3.6.x (на самом деле вам, вероятно, следует используйте JPA EntityManager
, а не основной API, но это уже другая история).
Но я бы посоветовал использовать ветвь Hibernate 3.5.x , а не 3.6.x. Как мы уже видели, команда Hibernate вносит большие изменения в 3.6, которая является вершиной того, что все еще находится в бета-версии, и, если вы внимательно не следите за изменениями, вы столкнетесь с некоторыми сюрпризами и не найдете много ресурсов в Интернете. пока что. Просто используйте Hibernate 3.5 (3.5.5-Final на момент написания этой статьи).
Верно, Эриксон правильно определил проблему.
Вероятно, это вызвано наличием двух конфликтующих версий одного и того же определения типа в вашем пути к классам. Например, library-version2.jar определяет некоторые вещи, но у вас также есть library-version5.jar в пути к классам.
Во время выполнения это приводит к боли и страданиям, описанным Эриксоном.
Дважды проверьте, все ли ваши библиотеки совместимы. Попробуйте то же самое со стабильной версией спящего режима, есть вероятность, что бета-версия неисправна или POM спящего режима 3.6.0 бета имеет несовместимые зависимости.
Попробуйте собрать его без maven и с библиотеками hibernate 3.6.0 beta1 с официальных серверов.
Хорошо, ваша проблема не ошибка, а новая функция . В примечаниях к выпуску Hibernate 3.6.0 Beta2 отмечается существенное изменение предыдущей бета-версии: AnnotationConfiguration полностью устарела . Поэтому вам следует (а) обновиться до самой последней бета-версии (Beta3), если вы хотите сохранить версию 3.6.0, и (б) не продолжать использовать AnnotationConfiguration.