java.sql.SQLException:连接为空



我试图在Hibernate数据库上保存对象,但我收到以下异常。似乎会话是打开和连接的,但代码无法提交。

    org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: commit failed
    ...
    org.hibernate.TransactionException: commit failed
    ...
    unable to commit against JDBC connection
    ...
    java.sql.SQLException: Connection is null.

我的代码

服务
@Override
@Transactional
public void registerUser(User user){
  ....
} 

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate4.HibernateJdbcException;
import org.springframework.stereotype.Repository;
@Repository
public class RegRepImpl implements RegRep {
@Autowired
SessionFactory sessionFactory;
@Override
public void registerUser(Member member) throws HibernateException,
    HibernateJdbcException {
        try {
            Session session = sessionFactory.getCurrentSession();
            if (session.isConnected()) {
                System.err.println("connected");
            }
            if (session.isOpen()) {
                System.err.println("is open");
            }
            session.save(member);
            session.flush();
            session.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
}

控制台输出

connected
is open
Hibernate: 
    /* insert com.myproject.model.Member
        */ insert 
        into
            Member
            (authority,enabled, fname, lname, password,username) 
        values
            (?, ?, ?, ?, ?, ?)
Jul 19, 2015 1:59:22 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [mp] in context with path [/myproject2] threw exception [Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: commit failed] with root cause
java.sql.SQLException: Connection is null.
    at org.apache.commons.dbcp2.DelegatingConnection.checkOpen(DelegatingConnection.java:608)
    at org.apache.commons.dbcp2.DelegatingConnection.commit(DelegatingConnection.java:362)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doCommit(JdbcTransaction.java:112)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:180)
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:521)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)
    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:207)

配置

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:8889/myproject" />
    <property name="username" value="daniel" />
    <property name="password" value="daniel" />
</bean>
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
    depends-on="dataSource">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.myproject.model" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.use_sql_comments">true</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
</bean>

<bean
    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

我认为在这种情况下您不需要关闭和刷新会话,因为您的会话是由请求发起的线程自动打开的,并且在请求完成时自动关闭。在这个请求中,你可以做任意数量的事务但这些事务只能在请求结束时提交这里你在事务提交之前关闭了一个会话所以在请求结束时提交的会话是空的因为你之前已经关闭了它

最新更新