我正在处理一个小应用程序,我正在尝试使用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();
}
}
}
我的hibernate配置非常简单:
<!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>
这是我正在使用的hibernate 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>
有人可以帮帮我吗?
答案 0 :(得分: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();
}
答案 1 :(得分:4)
3.6中已经删除了JDK 1.4支持。因此,Hibernate Annotations已合并回Core,不再需要Configuration
和AnnotationConfiguration
,后者不应该在3.6.x中使用(实际上,您应该使用JPA { {1}},而不是核心API,但这是另一个故事。)
但我真正的建议是使用Hibernate的 3.5.x 分支,而不是3.6.x.正如我们已经看到的那样,Hibernate团队正在引入3.6中的重大变化,这仍然处于测试阶段,除非您密切关注这些变化,否则您将面临一些惊喜,并且不会在互联网上找到很多资源然而。只需使用Hibernate 3.5(撰写本文时为3.5.5-Final)。
答案 2 :(得分:3)
仔细检查您的所有库是否兼容。尝试使用稳定版本的hibernate,测试版有缺陷或者hibernate 3.6.0 beta POM有一些不兼容的依赖。
尝试在没有maven和官方服务器的hibernate 3.6.0 beta1库的情况下构建它。
好的 - 您的问题不是错误,而是新功能。 Hibernate 3.6.0 Beta2的发行说明注意到之前测试版的重大变化:the AnnotationConfiguration is now totally deprecated。因此,如果您想保留3.6.0版本并且(b)不继续使用AnnotationConfiguration,您应该(a)更新到最新的beta(Beta3)。
答案 3 :(得分:2)
对,erickson已正确识别问题。
这可能是由于类路径中存在两个相同类型定义的冲突版本。例如,library-version2.jar定义了一些东西,但你的类路径中也有library-version5.jar。
在运行时,这会导致erickson描述的痛苦和痛苦。
答案 4 :(得分:1)
我写这个是为了帮助查找此错误的人。有时来自Spring Roo的jar文件生成pom.xml和Tomcat Server Runtime库冲突并在单元测试期间产生此错误。在构建像Flex这样的前端技术时,不需要在类路径中提供服务器运行时库,因此只需从类路径中删除服务器运行时库。
答案 5 :(得分:0)
您使用的是哪个应用服务器?可能是重复或冲突的hibernate jar。