在做spring和hibernate进行整合的时候,进行单元测试的时候,发现这样的异常
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Cannot open connection
在控制台已经没有任何错误,不知道谁什么原因,在google了半天也没找到原因。谢谢大家!数据库采用的是mysql
[b]问题补充:[/b]
我把xml发给大家看看。。非 常感谢啊 有点长 呵呵<?xml version="1.0" encoding="UTF-8"?>
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
context:annotation-config/<!-- 把注解注册到spring容器中 -->
<!--驱动类 -->
<!--URL -->
<!--连接数据库用户名-->
<!--连接数据库密码-->
<!-- 连接池启动的初始值 -->
<!-- 连接池的最大值 -->
<!-- 最大空闲值 ,经过高峰期后,恢复时候-->
<!-- 最小空闲值-->
<!-- 把hibernate session给spring管理 -->
<!-- 匹配上面的数据源 -->
bean/Person.hbm.xml
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=update
hibernate.show_sql=true
hibernate.format_sql=true
<!-- 基于注解的方式申明事物 -->
[b]问题补充:[/b]
因为我现在用的单元测试 还没有用到web容器 tomcat应该和tomcat没多大关系吧 呵呵!
[b]问题补充:[/b]
应该不是测试类的问题吧 测试类是这样写的
private static PersonServiceInter bean;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
ApplicationContext ac=new ClassPathXmlApplicationContext("springBean.xml");
bean=(PersonServiceInter)ac.getBean("[color=red]personservice[/color]");
}
@Test
public void testAdd() {
System.out.print("sss");
bean.add(new Person("jiba"));
}
personservice的类代码
@Transactional//注解方式申明事务
public class PersonService implements PersonServiceInter {
@Resource private SessionFactory sessionFactory; //用resource注解方式注入,一般都是这个方式
public void add(Person person){
sessionFactory.getCurrentSession().persist(person);//得到spring容器当前管理的session
//方法执行前打开事物,执行完后就自动关闭
}
那就可能你的组件里那个测试的类里没有注释事务吧
Could not open Hibernate Session for transaction
事务是怎么配的?可能没弄好
你的配置文件粘出来看看,应该是搞得有问题
:D 把事务交给spring控制,从spring中获得session,让spring事务去控制session打开或关闭
我是这么解决的
在MyEclipse6开发Struts2+Spring2+Hibernate3项目时,运行一切正常,但到了用Tomcat启动的时候,总是出现一下的错误信息:
javax.servlet.ServletException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed:
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:78)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
com.p3g.common.SessionFilter.doFilter(SessionFilter.java:58)
root cause
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed:
org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:524)
org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:322)
org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:255)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:102)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:176)
这到底是什么原因呢,我也搞了好几天,一直以为是Hibernate Session 未打开,我到MysQL中打开,查看进程show processlist;看到项目并未连接上数据库,总以为是配置问题,或是过滤器OpenSessionInView未打开数据库连接,也查阅了国外的论坛终究没有得到解答,但经过若干天的苦恼终于发现问题所在了,就是因为我们在MyEclipse中开发,会有MySQL-Connector-java.jar文件在JRE系统库中,但传到Tomcat的webapp上时,这个文件包不会上传到里面去,所以要手动拷贝到项目的lib文件夹下或是把MySQL-Connector-java.jar拷贝到Tomcat的lib文件夹下,这样问题就解决了,一切正常运行!!!
这些都是小问题,但却总困扰着我们,问题终于解决了,我也轻松了!!!!!!!!嘎嘎