Hibernate 程序出现的错误

今天写了个main测试hibernate annotation的方式CRUD数据库,用的手动导入需要的hibernate的jar包

/**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Configuration cf = null;
  SessionFactory sf = null;
  Transaction ts = null;
  Session session = null;
  try {
   //get the Configuration
   cf = new Configuration().configure();
   sf = cf.buildSessionFactory();
   session = sf.openSession();
   //open Transaction
   ts = session.beginTransaction();
   //Save Users
   Users user = new Users();
   user.setName("Share.zeng");
   session.save(user);
   //commit Transaction
   ts.commit();
   session.close();
   System.out.println("save successful.");
  } catch (Exception e) {
   // TODO: handle exception
   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    
 
//如果不用此包,在启动时会抛出: nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type   
asm.jar   
 
// 如果不用此包,在启动时抛出:nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException   
aspectjweaver.jar  
 
//如果不用此包,在启动时抛出:nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter   
cglib-2.1.3.jar   
 
//如果不用此包,在启动时抛出:nested exception is java.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.ja r  
 
//不用此包,在启动时招聘:java.lang.NoClassDefFoundError: javax/transaction/TransactionManager   
jta.jar   
 
//Hibernate必须使用,注意此包是包含全部的。   
hibernate3.jar

猜你喜欢

转载自huangcanqin.iteye.com/blog/1482152