java - ejemplo - hibernate properties
¿Qué es una excepción IncompatibleClassChangeError en Java? (6)
¿Qué servidor de aplicaciones estás usando? Podría ser un tarro de hibernación duplicado o conflictivo.
Estoy trabajando en una aplicación pequeña y estoy tratando de usar Anotaciones de Hibernación para asignar mis entidades. Quería probar si todo está bien cuando obtuve esta excepción:
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
¿Alguien puede explicar qué es esta excepción? Esta es la primera vez que lo veo. Aquí está el principal de mi aplicación:
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();
}
}
}
Mi configuración de hibernación es muy 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>
Aquí está la dependencia de hibernate maven que estoy usando:
<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>
Puede alguien ayudarme por favor ??
Comprueba si todas tus bibliotecas son compatibles. Intente lo mismo con una versión estable de hibernación, existe la posibilidad de que la versión beta tenga un defecto o la versión 3.6.0 POM de la hibernación tenga algunas dependencias incompatibles.
Intente construirlo sin Maven y con hibernate 3.6.0 bibliotecas beta1 desde los servidores oficiales.
De acuerdo, su problema no es un error sino una nueva característica . Las notas de la versión para Hibernate 3.6.0 Beta2 observan un cambio importante en la versión beta anterior: la AnnotationConfiguration ahora está totalmente en desuso . Por lo tanto, debería (a) actualizar a la versión beta más reciente (Beta3) si desea mantener una versión 3.6.0 y (b) no continuar utilizando la Configuración de Anotación.
Correcto, Erickson ha identificado el problema correctamente.
Esto probablemente se debe a que tiene dos versiones en conflicto de la misma definición de tipo en su ruta de clase. Por ejemplo, library-version2.jar define algunas cosas, pero también tienes library-version5.jar en tu classpath.
En el tiempo de ejecución, esto se traduce en el dolor y el sufrimiento que Erickson describe.
El soporte de JDK 1.4 se ha reducido en 3.6. Por lo tanto, Hibernate Annotations se ha vuelto a combinar en Core y ya no hay necesidad de tener tanto Configuration
como AnnotationConfiguration
y esta última no debería usarse en 3.6.x (en realidad, probablemente debería usar el EntityManager
JPA, no la API Core, pero esto es otra historia).
Pero mi verdadero consejo sería usar la rama 3.5.x de Hibernate, no la 3.6.x. Como ya vimos, el equipo de Hibernate está introduciendo grandes cambios en la versión 3.6, que además está en Beta, y a menos que esté siguiendo de cerca los cambios, se enfrentará a algunas sorpresas y no encontrará muchos recursos en Internet. todavía. Solo use Hibernate 3.5 (3.5.5-Final al momento de escribir esto).
Escribo esto para ayudar a quienquiera que busque este error. A veces, los archivos jar procedentes de Spring Roo generaron conflictos entre las bibliotecas pom.xml y Tomcat Server Runtime y produjeron este error durante la prueba de la unidad. Mientras se crea una tecnología de interfaz como Flex, las bibliotecas de tiempo de ejecución del servidor no son necesarias para presentarlas en la ruta de clase, por lo que simplemente elimine las bibliotecas de tiempo de ejecución del servidor de la ruta de clase.
Significa que en algún momento, una interface
se cambió a una class
, pero un implementador de la interfaz original no se modificó ni se volvió a compilar para adaptarse a este cambio (incompatible).
Por ejemplo, considere los siguientes tipos:
interface Fooable {
void foo();
}
class FooImpl implements Fooable {
public void foo() {
/* Do something... */
}
}
Ahora suponga que Fooable
se modifica y se vuelve a compilar, pero FooImpl
no es:
abstract class Fooable {
public abstract void foo();
}