Maven Spring-Hibernate连接错误

Maven Spring-Hibernate连接错误,maven,junit,spring-4,hibernate-5.x,Maven,Junit,Spring 4,Hibernate 5.x,当我尝试用JUnit测试DAO类时,它抛出以下错误 org.hibernate.resource.jdbc.internal。LogicalConnectionManagedImpl@1255b1d1已关闭 我将Spring4与Hibernate5、mysql和maven一起使用 java.lang.IllegalStateException: org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl@1255b1d1 i

当我尝试用JUnit测试DAO类时,它抛出以下错误 org.hibernate.resource.jdbc.internal。LogicalConnectionManagedImpl@1255b1d1已关闭

我将Spring4与Hibernate5、mysql和maven一起使用

java.lang.IllegalStateException: org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl@1255b1d1 is closed
    at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.errorIfClosed(AbstractLogicalConnectionImplementor.java:37)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:128)
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getConnectionForTransactionManagement(LogicalConnectionManagedImpl.java:247)
    at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.rollback(AbstractLogicalConnectionImplementor.java:114)
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.rollback(JdbcResourceLocalTransactionCoordinatorImpl.java:239)
    at org.hibernate.engine.transaction.internal.TransactionImpl.rollback(TransactionImpl.java:100)
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:608)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.doRollbackOnCommitException(AbstractPlatformTransactionManager.java:900)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:789)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
    at com.sun.proxy.$Proxy20.saveUser(Unknown Source)
    at TestUserDao.testSaveUser(TestUserDao.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Hibernate-test.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
                            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
                            http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">


    <context:property-placeholder location="classpath:database.properties" />

    <context:component-scan  base-package="com.timelee" />

    <tx:annotation-driven transaction-manager="transactionManager"/>


     <!--  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  -->

     <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
       <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}"/>




    </bean>



    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" >
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan">
            <list>
                <value>com.timelee.timesheet.models</value>
                <value>com.timelee.users.models</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql:false}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql:false}</prop>
            </props>
        </property>       
    </bean>

    <bean id="transactionManager"  class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="persistenceExceptionTranslationPostProcessor"
        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

</beans>
}

UserDaoImpl.java

package com.timelee.users.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.timelee.users.model.User;

@Repository("userDao")
@Transactional
public class UserDaoImpl extends AbstractDao implements UserDao
{
    @Autowired
    private SessionFactory sessionFactory;
public boolean saveUser(User user)
{

    Transaction tx = null;
     Session session=sessionFactory.getCurrentSession();
      try
      {
          tx = session.beginTransaction();
          session.saveOrUpdate(user);
          tx.commit();
          return true;
      }

      catch (Exception e) 
      {
        if (tx!=null) 
            tx.rollback();
        e.printStackTrace();
        return false;
    }

      finally 
      {
          session.close(); 
       }

}


@SuppressWarnings("unchecked")
public List<User> getUsers()
{
     List<User> users;
     Transaction tx = null;
     Session session=sessionFactory.getCurrentSession();
      try
      {
          tx = session.beginTransaction();
          users=(List<User>) session.createQuery("FROM USER"); 
          tx.commit();
          return users;
      }

      catch (Exception e) 
      {
        if (tx!=null) 
            tx.rollback();
        e.printStackTrace();
    }

      finally {
          session.close(); 
       }
    return null;
}

public User getUser(String id)
{
     User user;
     Transaction tx = null;
     Session session=sessionFactory.getCurrentSession();
      try
      {
          tx = session.beginTransaction();
          user=(User)session.get(User.class,id);
          tx.commit();
          return user;
      }

      catch (Exception e) 
      {
        if (tx!=null) 
            tx.rollback();
        e.printStackTrace();
        return null;
    }

      finally 
      {
          session.close(); 
       }

}



public boolean updateUser(User user)
{
    Transaction tx = null;
    Session session = sessionFactory.getCurrentSession();
    try
        {
            tx = session.beginTransaction();
            session.update(user);
            tx.commit();
            return true;
        }

    catch (Exception e)
        {
            if (tx != null)
                tx.rollback();
            e.printStackTrace();
            return false;
        }

    finally
        {
            session.close();
        }
}


public boolean deleteUserById(String id)
{
    User user = new User();
    user.setId(id);
    Transaction tx = null;
    Session session = sessionFactory.getCurrentSession();
    try
        {
            tx = session.beginTransaction();
            session.delete(user);
            tx.commit();
            return true;
        }

    catch (Exception e)
        {
            if (tx != null)
                tx.rollback();
            e.printStackTrace();
            return false;
        }

    finally
        {
            session.close();
        }
}
package com.timelee.users.dao;
导入java.util.List;
导入org.hibernate.Session;
导入org.hibernate.SessionFactory;
导入org.hibernate.Transaction;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Repository;
导入org.springframework.transaction.annotation.Transactional;
导入com.timelee.users.model.User;
@存储库(“userDao”)
@交易的
公共类UserDaoImpl扩展了AbstractDao,实现了UserDao
{
@自动连线
私人会话工厂会话工厂;
公共布尔存储用户(用户)
{
事务tx=null;
Session Session=sessionFactory.getCurrentSession();
尝试
{
tx=session.beginTransaction();
session.saveOrUpdate(用户);
tx.commit();
返回true;
}
捕获(例外e)
{
如果(tx!=null)
tx.回滚();
e、 printStackTrace();
返回false;
}
最后
{
session.close();
}
}
@抑制警告(“未选中”)
公共列表getUsers()
{
列出用户名单;
事务tx=null;
Session Session=sessionFactory.getCurrentSession();
尝试
{
tx=session.beginTransaction();
users=(List)session.createQuery(“来自用户”);
tx.commit();
返回用户;
}
捕获(例外e)
{
如果(tx!=null)
tx.回滚();
e、 printStackTrace();
}
最后{
session.close();
}
返回null;
}
公共用户getUser(字符串id)
{
用户;
事务tx=null;
Session Session=sessionFactory.getCurrentSession();
尝试
{
tx=session.beginTransaction();
user=(user)session.get(user.class,id);
tx.commit();
返回用户;
}
捕获(例外e)
{
如果(tx!=null)
tx.回滚();
e、 printStackTrace();
返回null;
}
最后
{
session.close();
}
}
公共布尔更新器(用户)
{
事务tx=null;
Session Session=sessionFactory.getCurrentSession();
尝试
{
tx=session.beginTransaction();
会话更新(用户);
tx.commit();
返回true;
}
捕获(例外e)
{
如果(tx!=null)
tx.回滚();
e、 printStackTrace();
返回false;
}
最后
{
session.close();
}
}
公共布尔deleteUserById(字符串id)
{
用户=新用户();
user.setId(id);
事务tx=null;
Session Session=sessionFactory.getCurrentSession();
尝试
{
tx=session.beginTransaction();
删除(用户);
tx.commit();
返回true;
}
捕获(例外e)
{
如果(tx!=null)
tx.回滚();
e、 printStackTrace();
返回false;
}
最后
{
session.close();
}
}

}

位于org.springframework.transaction.support.AbstractPlatformTransactionManager.doRollbackOnCommitException(AbstractPlatformTransactionManager.java:900)

SpringTest试图在测试中为您自动化事务,因此您肯定不需要自己管理任何JPA/事务

如果确实要管理事务,则不要将其标记为
@Transactional


您也可能受益于
spring数据jpa
。它将允许您放弃大多数DAO。

对不起,各位,我从下面的链接找到了解决问题的方法
package com.timelee.users.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.timelee.users.model.User;

@Repository("userDao")
@Transactional
public class UserDaoImpl extends AbstractDao implements UserDao
{
    @Autowired
    private SessionFactory sessionFactory;
public boolean saveUser(User user)
{

    Transaction tx = null;
     Session session=sessionFactory.getCurrentSession();
      try
      {
          tx = session.beginTransaction();
          session.saveOrUpdate(user);
          tx.commit();
          return true;
      }

      catch (Exception e) 
      {
        if (tx!=null) 
            tx.rollback();
        e.printStackTrace();
        return false;
    }

      finally 
      {
          session.close(); 
       }

}


@SuppressWarnings("unchecked")
public List<User> getUsers()
{
     List<User> users;
     Transaction tx = null;
     Session session=sessionFactory.getCurrentSession();
      try
      {
          tx = session.beginTransaction();
          users=(List<User>) session.createQuery("FROM USER"); 
          tx.commit();
          return users;
      }

      catch (Exception e) 
      {
        if (tx!=null) 
            tx.rollback();
        e.printStackTrace();
    }

      finally {
          session.close(); 
       }
    return null;
}

public User getUser(String id)
{
     User user;
     Transaction tx = null;
     Session session=sessionFactory.getCurrentSession();
      try
      {
          tx = session.beginTransaction();
          user=(User)session.get(User.class,id);
          tx.commit();
          return user;
      }

      catch (Exception e) 
      {
        if (tx!=null) 
            tx.rollback();
        e.printStackTrace();
        return null;
    }

      finally 
      {
          session.close(); 
       }

}



public boolean updateUser(User user)
{
    Transaction tx = null;
    Session session = sessionFactory.getCurrentSession();
    try
        {
            tx = session.beginTransaction();
            session.update(user);
            tx.commit();
            return true;
        }

    catch (Exception e)
        {
            if (tx != null)
                tx.rollback();
            e.printStackTrace();
            return false;
        }

    finally
        {
            session.close();
        }
}


public boolean deleteUserById(String id)
{
    User user = new User();
    user.setId(id);
    Transaction tx = null;
    Session session = sessionFactory.getCurrentSession();
    try
        {
            tx = session.beginTransaction();
            session.delete(user);
            tx.commit();
            return true;
        }

    catch (Exception e)
        {
            if (tx != null)
                tx.rollback();
            e.printStackTrace();
            return false;
        }

    finally
        {
            session.close();
        }
}