学习搭建Hibernate开发时,报错java.lang.ExceptionInInitializerError。
具体情况:项目使用的相关文件 :hibernate-distribution-3.3.2.GA hibernate-annotations-3.4.0.GA slf4j-1.5.8
我使用的Hibernate文件可以从这里下载 http://pan.baidu.com/share/link?shareid=121558&uk=4077895710
slf4j 1.5.8 http://pan.baidu.com/share/link?shareid=121561&uk=4077895710
步骤如下:
1、新建Java Project ,
导入 hibernate-distribution-3.3.2.GA下的 hibernate3.jar 以及 /lib/required 下所有的 jar,如下 :
antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar
javassist-3.9.0.GA.jar jta-1.1.jar slf4j-api-1.5.8.jar ;
2、再倒入slf4j-1.5.8文件里面slf4j的实现包 slf4j-nop-1.5.8.jar ,
3、导入hibernate-annotations-3.4.0.GA下 hibernate-annotations.jar及lib下
ejb3-persistence.jar和 hibernate-commons-annotations.jar
4、导入mysql驱动 4、mysql-connector-java-5.1.7-bin.jar
当时为了将Hibernate所有的依赖的jar放在一起,我的导入方式如下:
windows -> Preferences ->Java ->Build Path ->User Libraries -> New ,写入名称Hibernate3.3,
同时勾选个下面的“System Library(added to the boot class )path” ,这是错误的原因。
将新建的这个 User Library加入到项目中。
最后项目中的Hibernate共有11个jar文件:
然后按照常规的写了一个POJO类,
代码 :User.java
package com.hibernate;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User implements java.io.Serializable {
private int id;
private String name;
private String passwd;
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
}
配置文件 :hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/jdbc</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="connection.pool_size">1</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="current_session_context_class">thread</property>
<mapping class="com.hibernate.User" />
</session-factory>
</hibernate-configuration>
自动建表类 :CreateDB.java
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;
public class CreateDB {
public static void main(String[] args) {
Configuration cfg = new AnnotationConfiguration().configure();
SchemaExport sExport = new SchemaExport(cfg);
sExport.create(true, true);
}
}
运行报错报错:
查了半天没找到原因,有的说是没有 log4j.properties 这个文件 ,我加入后还是报错。
最后百度老久发现原来是将User Library加入到System Library的原因 ,编辑一下刚才新建的User Library,
把System Library(added to the boot class )path 勾掉(不勾选)就神奇的好了,
具体是什么原理我也不知道,哪位大神要是知道,还望不惜赐教 !!