Hibernate 程序出现的错误
今天写了个main测试hibernate annotation的方式CRUD数据库,用的手动导入需要的hibernate的jar包
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Configurationcf=null;
SessionFactorysf=null;
Transactionts=null;
Sessionsession=null;
try{
//gettheConfiguration
cf=newConfiguration().configure();
sf=cf.buildSessionFactory();
session=sf.openSession();
//openTransaction
ts=session.beginTransaction();
//SaveUsers
Usersuser=newUsers();
user.setName("Share.zeng");
session.save(user);
//commitTransaction
ts.commit();
session.close();
System.out.println("savesuccessful.");
}catch(Exceptione){
//TODO:handleexception
e.printStackTrace();
}
}出了个异常:Exception in thread "main" java.lang.NoClassDefFoundError: javax/transaction/Synchronization
网上一查说我的Transaction 实例的jar没导对? 我用的却是是hibernate的import org.hibernate.cfg.Configuration;
后来发现说缺省了jta-1.1.jar 这jar,我测试了下确实是这样。
还查了下hibernate.jar中Transaction类和jta-*.jar Transaction类的关系,他们的对象是hibernate的 Transaction类引用了jta-*.jar Transaction
package org.hibernate;
import javax.transaction.Synchronization;
public abstract interface Transaction
{
..........继续查了下 hibernate需要导入的基本jar(转载)
hibernate3.jar: Hibernate的库,没有什么可说的,必须使用的jar包
cglib-2.1.3.jar: CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包
asm.jar: 和cglib-2.1.3.jar有点类似
dom4j.jar: dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j,直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,Hibernate用它来读写配置文件。
commons-collections.jar: Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。
commons-logging.jar: 它的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包的功能比log4j差的很远,性能也一般。后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的log程序,底层的Logger是可以切换的,你可以选择log4j,java.util.logging或者它自带的Simple Logger。不过我仍然强烈建议使用log4j,因为log4j性能很高,log输出信息时间几乎等于System.out,而处理一条log平均只需要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件,你只需要到Apache 网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。
log4j-1.2.11.jar: 不用多说了
jta.jar: JTA规范,JTA(Java Transaction API)是一种高层的,与实现无关的,与协议无关的API,应用程序和应用服务器可以使用JTA来访问事务。当Hibernate使用JTA的时候需要,不过App Server都会带上,所以也是多余的。我这里必须使用,可能是因为Tomcat只是Web Server而非App Server的缘故。
ehcache-1.1.jar: 在Hibernate中使用它作为数据缓存的解决方案.
antlr-2.7.6rc1.jar: 在用hibernate3.0进行查询时,出现java.lang.NoClassDefFoundError: /ANTLRException异常. 所以必须导入.
看到一个关于此内容的网友帖子
//如果不用,会抛出异常:java.lang.NoClassDefFoundError:antlr/ANTLRException
antlr-2.7.2.jar
//如果不用此包,在启动时会抛出:nestedexceptionisjava.lang.NoClassDefFoundError:org/objectweb/asm/Type
asm.jar
//如果不用此包,在启动时抛出:nestedexceptionisjava.lang.NoClassDefFoundError:org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException
aspectjweaver.jar
//如果不用此包,在启动时抛出:nestedexceptionisjava.lang.NoClassDefFoundError:net/sf/cglib/proxy/CallbackFilter
cglib-2.1.3.jar
//如果不用此包,在启动时抛出:nestedexceptionisjava.lang.NoClassDefFoundError:org/apache/commons/collections/SequencedHashMap
commons-collections-3.1.jar
//这个就不用说啦,几乎所有框架都要使用的
commons-logging-1.0.4.jar
//如果不用此包会抛出:java.lang.NoClassDefFoundError:org/dom4j/DocumentException
dom4j-1.6.1.jar
//不用此包,在启动时招聘:java.lang.NoClassDefFoundError:javax/transaction/TransactionManager
jta.jar
//Hibernate必须使用,注意此包是包含全部的。
hibernate3.jar