`
sslaowan
  • 浏览: 373940 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring+Hibernate事务处理,很简单的例子出错

阅读更多

   项目第一次使用SSH,于是准备先做个Demo出来,就是想实现用户注册和登录,可是在持久化时就是遇到了问题。
   这个问题困扰了我和跟我pair的兄弟一天了,试验了几种方法,代码和Spring开发参考手册上的基本上一样,也用过其他人的方法,别人的程序在我的环境下没有问题,仿照他们的代码自己编一个就不行,几种方法的共性问题是:
     java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;)Z
    不同的方法会有不同的错误呈现,然而总是会出现这句话。
     我使用MyEclipse5.1的add spring capabilities和add hibernate capabilities自动生成的POJO和mapping文件,一切顺利,如下所示:

java 代码
  1. default package  
  2.   
  3.     
  4.   
  5. /**  
  6.  * User generated by MyEclipse - Hibernate Tools  
  7.  */  
  8.   
  9. public class User  implements java.io.Serializable {   
  10.   
  11.   
  12.     // Fields       
  13.   
  14.      private String userID;   
  15.      private String userName;   
  16.      private String password;   
  17.   
  18.   
  19.     // Constructors   
  20.   
  21.     /** default constructor */  
  22.     public User() {   
  23.     }   
  24.   
  25.        
  26.     /** full constructor */  
  27.     public User(String userID, String userName, String password) {   
  28.         this.userID = userID;   
  29.         this.userName = userName;   
  30.         this.password = password;   
  31.     }   
  32.   
  33.       
  34.     // Property accessors   
  35.   
  36.     //省略存取器方法   
  37.   
  38. }   


  

 

java 代码
  1. // default package      
  2.      
  3. import java.util.List;      
  4. import org.apache.commons.logging.Log;      
  5. import org.apache.commons.logging.LogFactory;      
  6. import org.hibernate.LockMode;      
  7. import org.springframework.context.ApplicationContext;      
  8. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;      
  9.      
  10.      
  11. /**    
  12.  * Data access object (DAO) for domain model class User.    
  13.  * @see .User    
  14.  * @author MyEclipse - Hibernate Tools    
  15.  */     
  16. public class UserDAO extends HibernateDaoSupport {      
  17.      
  18.     private static final Log log = LogFactory.getLog(UserDAO.class);      
  19.      
  20.      
  21.  protected void initDao() {      
  22.   //do nothing      
  23.  }      
  24.           
  25.     public void save(User transientInstance) {      
  26.         log.debug("saving User instance");      
  27.          
  28.      
  29.         try {      
  30.             getHibernateTemplate().save(transientInstance);      
  31.             log.debug("save successful");      
  32.         } catch (RuntimeException re) {      
  33.             log.error("save failed", re);      
  34.                      throw re;      
  35.         }      
  36.   
  37.   public static UserDAO getFromApplicationContext(ApplicationContext ctx) {   
  38.      return (UserDAO) ctx.getBean("UserDAO");   
  39.  }   
  40.      
  41.     }     

 之后是配置文件:hibernate.cfg.xml

xml 代码
  1. <?xml version='1.0' encoding='UTF-8'?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC   
  3.           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
  4.           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5.   
  6. <!-- Generated by MyEclipse Hibernate Tools.                   -->  
  7. <hibernate-configuration>  
  8.   
  9.     <session-factory>  
  10.         <property name="connection.username">SOMIS</property>  
  11.         <property name="connection.url">  
  12.             jdbc:oracle:thin:@127.0.0.1:1521:ORA92   
  13.         </property>  
  14.         <property name="dialect">  
  15.             org.hibernate.dialect.Oracle9Dialect   
  16.         </property>  
  17.         <property name="myeclipse.connection.profile">SOMIS</property>  
  18.         <property name="connection.password">ss</property>  
  19.         <property name="connection.driver_class">  
  20.             oracle.jdbc.driver.OracleDriver   
  21.         </property>  
  22.         <mapping resource="User.hbm.xml" />  
  23.   
  24.     </session-factory>  
  25.   
  26. </hibernate-configuration>  

 spring的配置文件,applicationContext.xml

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3.   
  4. <beans>  
  5.   
  6.   
  7.     <bean id="sessionFactory"  
  8.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  9.         <property name="configLocation">  
  10.             <value>file:src/hibernate.cfg.xml</value>  
  11.         </property>  
  12.     </bean>  
  13.     <bean id="UserDAO" class="UserDAO">  
  14.         <property name="sessionFactory">  
  15.             <ref bean="sessionFactory" />  
  16.         </property>     
  17.            
  18.     </bean>  
  19.        
  20.   
  21. </beans>  

以下是测试代码:

java 代码
  1. import org.springframework.context.ApplicationContext;   
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  3.   
  4. import junit.framework.TestCase;   
  5.   
  6.   
  7. public class UserDAOTest extends TestCase {   
  8.   
  9.     public void testSave() {   
  10.   
  11.         ApplicationContext ctx = new ClassPathXmlApplicationContext( new  
  12.                    String[] { "applicationContext.xml" });   
  13.         
  14.            
  15.         UserDAO userDAO=UserDAO.getFromApplicationContext(ctx);   
  16.         User user=new User();   
  17.         user.setPassword("123");   
  18.         user.setUserID("1");   
  19.         user.setUserName("admin");   
  20.         userDAO.save(user);   
  21.     }   
  22.   
  23. }   

        这时测试可以通过(使用Spring自带的测试类也测试过)。

      然后在配置文件中加入声明式事务处理,测试就通不过了。

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3.   
  4. <beans>  
  5.   
  6.   
  7.     <bean id="sessionFactory"  
  8.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  9.         <property name="configLocation">  
  10.             <value>file:src/hibernate.cfg.xml</value>  
  11.         </property>  
  12.     </bean>  
  13.     <bean id="UserDAO" class="UserDAO">  
  14.         <property name="sessionFactory">  
  15.             <ref bean="sessionFactory" />  
  16.         </property>     
  17.            
  18.     </bean>  
  19.        
  20.      <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  21.        <property name="sessionFactory"><ref bean="sessionFactory"/></property>  
  22.     </bean>  
  23.        
  24.    <bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  25.         <property name="transactionManager" >  
  26.             <ref bean="transactionManager"/>  
  27.         </property>  
  28.         <property name="target">  
  29.             <ref bean="UserDAO"/>  
  30.         </property>  
  31.         <property name="transactionAttributes">  
  32.              <props>  
  33.                 <prop key="save">PROPAGATION_REQUIRED</prop>  
  34.              </props>  
  35.         </property>  
  36.     </bean>     
  37. </beans>  

        这是很平常的写法了,可是就是不知道为什么会报下面的错误:      

  1. org.springframework.beans.factory.BeanCreationException: Error 
  2. creating bean with name 'userDAOProxy' defined in class path
  3.  resource [applicationContext.xml]: Instantiation of bean failed;
  4.  nested exception is org.springframework.beans.BeanInstantiationException:
  5.  Could not instantiate bean class [org.springframework.transaction.interceptor.TransactionProxyFactoryBean]:
  6.  Constructor threw exception; nested exception is java.lang.NoSuchMethodError: 
  7. org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;)Z   
  8. org.springframework.beans.BeanInstantiationException: 
  9. Could not instantiate bean class [org.springframework.transaction.interceptor.TransactionProxyFactoryBean]: 
  10. Constructor threw exception; nested exception is java.lang.NoSuchMethodError: 
  11. org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;)Z   
  12. java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;)Z   
  13.     at org.springframework.aop.framework.DefaultAopProxyFactory.<clinit>(DefaultAopProxyFactory.java:56)   
  14.     at org.springframework.aop.framework.ProxyConfig.<init>(ProxyConfig.java:63)   
  15.     at org.springframework.aop.framework.AbstractSingletonProxyFactoryBean.<init>(AbstractSingletonProxyFactoryBean.java:39)   
  16.     at org.springframework.transaction.interceptor.TransactionProxyFactoryBean.<init>(TransactionProxyFactoryBean.java:105)   
  17.     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)   
  18.     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)   
  19.     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)   
  20.     at java.lang.reflect.Constructor.newInstance(Unknown Source)   
  21.     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:171)   
  22.     at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)   
  23.     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:52)   
  24.     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:486)   
  25.     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:362)   
  26.     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:233)   
  27.     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:145)   
  28.     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:277)   
  29.     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:313)   
  30.     at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:87)   
  31.     at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:72)   
  32.     at UserDAOTest.testSave(UserDAOTest.java:11)   
  33.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   
  34.     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)   
  35.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)   
  36.     at java.lang.reflect.Method.invoke(Unknown Source)   
  37.     at junit.framework.TestCase.runTest(TestCase.java:154)   
  38.     at junit.framework.TestCase.runBare(TestCase.java:127)   
  39.     at junit.framework.TestResult$1.protect(TestResult.java:106)   
  40.     at junit.framework.TestResult.runProtected(TestResult.java:124)   
  41.     at junit.framework.TestResult.run(TestResult.java:109)   
  42.     at junit.framework.TestCase.run(TestCase.java:118)   
  43.     at junit.framework.TestSuite.runTest(TestSuite.java:208)   
  44.     at junit.framework.TestSuite.run(TestSuite.java:203)   
  45.     at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:128)   
  46.     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)   
  47.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)   
  48.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)   
  49.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)   
  50.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)  


         后来我又使用了编程式事务处理,直接报错就是

       java.lang.NoSuchMethodError: org.springframework.util.ClassUtils.isPresent(Ljava/lang/String;)Z

        使用声明式事务处理也试过下面的代码:

xml 代码
  1. <!--事务拦截器,激活事务管理器所必须的bean-->  
  2.      <bean id="transactionInterceptor"    
  3.   
  4. class="org.springframework.transaction.interceptor.TransactionInterceptor">  
  5.         <!--  事务拦截器bean需要依赖注入一个事务管理器 -->  
  6.         <property name="transactionManager" ref="transactionManager"/>  
  7.         <property name="transactionAttributes">  
  8.             <!--  下面定义事务传播属性-->  
  9.             <props>  
  10.                 <!--PROPAGATION_REQUIRE规则表示:在bean中所有以get开头的方法,当抛出异   
  11.   
  12. 常时,自动回滚,并只读,其他异常自动回滚-->  
  13.                 <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>  
  14.                 <prop key="*">PROPAGATION_REQUIRED</prop>  
  15.             </props>  
  16.         </property>  
  17.     </bean>  
  18.   
  19.     <!--定义事务处理代理bean,他需要两个属性,一个是指定需要代理的bean,另一个是代理bean所需的   
  20.   
  21. 事务拦截器-->  
  22.     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  23.         <!--  指定对满足哪些bean name的bean自动生成业务代理 -->  
  24.         <property name="beanNames">  
  25.             <!--  下面是所有需要自动创建事务代理的bean-->  
  26.             <list>  
  27.                 <value>UserDAO</value>  
  28.             </list>  
  29.             <!--  此处可增加其他需要自动创建事务代理的bean-->  
  30.         </property>  
  31.         <!--  下面定义BeanNameAutoProxyCreator所需的事务拦截器-->  
  32.         <property name="interceptorNames">  
  33.             <list>  
  34.                 <!-- 此处可增加其他新的Interceptor -->  
  35.                 <value>transactionInterceptor</value>    
  36.             </list>  
  37.         </property>  
  38.     </bean>          

                 依然报错,不知道怎么办了。

               在Google,百度,Yahoo都搜过了,有位仁兄说了句Debug找错就完了。

               对了,MyEclipse自动加入的spring1.2的包里 org.springframework.util.ClassUtils真的没有isPresent方法,可是我加了spring2.0的包,还是不行。

             我是束手无策了,使用的最简单的方法(网上,书上,Rod Johnson的两本,再加上各种国内的技术书都看遍了,都使用这种方法),就这么几个文件,真的不知道怎么办了,望~        

 

分享到:
评论
4 楼 haojing_hj 2007-11-09  
我也遇到了同样的问题,我的问题的原因是:spring包的版本有冲突,把所有的包删除后重新导入一遍就好了
3 楼 sslaowan 2007-10-22  
sqrt3soft 写道
我也是遇到过这个问题,后来把spring-beans-2.0.1.jar,spring-core-2.0.1.jar,spring-web-2.0.1.jar这三个包去掉就行了,具体是哪个包在做怪我就没去试了,你也试一下吧


  嗯,觉得就是欺负新人,我现在已经搞定了,也没变过什么,新建了一个工程就好了。当初刚用时是走一步错一步
2 楼 kyo100900 2007-10-22  
包的不兼容问题
1 楼 sqrt3soft 2007-10-22  
我也是遇到过这个问题,后来把spring-beans-2.0.1.jar,spring-core-2.0.1.jar,spring-web-2.0.1.jar这三个包去掉就行了,具体是哪个包在做怪我就没去试了,你也试一下吧

相关推荐

    用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统

    事务处理也交由Spring去管理。  压缩文件中不包含Jar文件(由于全部的Jar将近12M,不能全部上传),所用到的Jar目录为,工程中再也不会出现由于MyEclipse自动整合而出现的大量Jar文件 : Java代码 1. //如果不用,...

    会员管理系统(struts+hibernate+spring)130226.rar

    Spring框架在整个系统中起到了粘合剂的作用,它将Struts和Hibernate框架整合在一起,实现了依赖注入和事务管理等功能。通过Spring的配置,开发人员可以方便地对各个组件进行管理和控制,提高了系统的

    06丨20%的业务代码的Spring声明式事务,可能都没处理正确

    Spring 针对 Java Transaction API (JTA)、JDBC、Hibernate 和 Java Persistence API (JPA) 等事务 API,实现了一致的编程模型,而 Spring 的声明式事务功能更是提供了极其方便的事务配置方式,配合 Spring Boot 的...

    web项目常用jar包及说明.zip

    6.jta-1.1.jar(hibernate对事务的处理) 7.slf4j-api-1.6.4.jar(一个日志系统的服务的api) 8.slf4j-nop-1.6.4.jar(对slf4j-api-x.x.x.jar的一个实现) 9.ojdbc14.jar (oracle驱动) 10.mysql-connector-java-...

    Spring、SpringMVC和Mybatis框架整合包

    手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis ...第二,它可以使用xml的方式来组织管理我们的sql,因为一般程序出错很多情况下是sql出错,别人接手代码后能快速找到出错地方,甚至可以优化原来写的sql。

    《MyEclipse 6 Java 开发中文教程》前10章

    第一章 安装配置开发环境 18 1.1系统需求 18 1.2 JDK 的下载,安装和配置(可...10.7.2 MyEclipse生成的Spring+Hibernate无法保存数据问题的解决方法2 - 用 CGLIB 来实现事务管理 258 10.7.3 Spring相关的参考资料 261

    springmybatis

    (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加一条,其实大家可以看官方的教程更好些:http://mybatis.github.io/mybatis-3/,而且如果英文不是很好的那就看...

    SSH 项目 整合jar包

    6.jta-1.1.jar(hibernate对事务的处理) 7.slf4j-api-1.6.4.jar(一个日志系统的服务的api) 8.slf4j-nop-1.6.4.jar(对slf4j-api-x.x.x.jar的一个实现) 9.ojdbc14.jar (oracle驱动) 10.mysql-connector-java-...

    SSH 框架所需JAR包

    6.jta-1.1.jar(hibernate对事务的处理) 7.slf4j-api-1.6.4.jar(一个日志系统的服务的api) 8.slf4j-nop-1.6.4.jar(对slf4j-api-x.x.x.jar的一个实现) 9.ojdbc14.jar (oracle驱动) 10.mysql-connector-java-...

    计算机专业毕业实习日记.docx

    今天就简单聊聊上面的Struts+Spring+Hibernate吧。 Struts 代表:表示层;Spring代表:业务逻辑层;Hibernate则代表持久层。他们是目前在Java Web编程开发中用得最多的框架,其实这样区分是为了适应软件开发过程中...

    IOIF面向项目的开源开发框架

    IOIF以EXTJS为前端,以Spring、Struts、Hibernate为后端,整合了Proxool、Log4j、Quartz、Oscache、Castor、Memcached、redis等优秀的开源软件。 支持Tomcat6及Resin3等应用服务器,支持Oracle、MYSQL等数据库。IOIF...

    dexcoder-assistant:dexcoder 快速开发工具包

    如果你不喜欢用Hibernate、Mybaits这类ORM框架,喜欢Spring JdbcTemplate或DbUtils,那么可以试试这个封装的通用dal,这可能是目前封装的最方便易用的通用dal层了。 最近更新: 版本 2.3.5 更新时间:2016-06-08 重构...

    iuhyiuhkjh908u0980

    在工程目录下创建libs/hibernate/ ,放入 hibernate-tools-3.2.0.ga.jar jtidy-4aug2000r7-dev.jar build.properties project.name=sw project.version=1.0 basedir=. build.dir =${basedir}/build web.dir = ${...

Global site tag (gtag.js) - Google Analytics