2015-07-19 73 views
0

我想保存Hibernate数据库上的对象,但我收到以下异常。看起来会话是开放和连接的,但代码无法提交。java.sql.SQLException:连接为空

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" /> 
+1

我认为问题不在于那段代码,而是在它之外。您的交易管理器出现问题。 –

+0

@LuiggiMendoza我是org.springframework.orm.hibernate4.HibernateTransactionManager哪部分代码应该包含在问题中? –

+0

你如何获得会话工厂对象?你能在这里粘贴这段代码吗? –

回答

2

Okies。在这种情况下,我认为您不需要关闭和刷新会话,因为您的会话由请求发起的线程自动打开,并在请求完成时自动关闭。因此,在该请求中,您可以执行任意数量的事务,但只有在请求结束时才会提交这些事务,因此在事务提交之前您正在关闭会话,因此在请求结束时,由于您已提交会话而导致会话为空更早关闭它。

相关问题