Java 无法保存休眠4数据

Java 无法保存休眠4数据,java,spring,hibernate,Java,Spring,Hibernate,我做了很多研究,但我没有得到解决方案,我的错误是 org.hibernate.HibernateException: No Session found for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) at org.hibernate.internal.SessionFactoryImp

我做了很多研究,但我没有得到解决方案,我的错误是

org.hibernate.HibernateException: No Session found for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:978)
    at dao.GenericDaoImpl.save(GenericDaoImpl.java:42)
    at dao.UserDao.save(UserDao.java:18)
    at controllers.UserController.userRegistrationSubmit(UserController.java:36)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:838)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
我的SpringConfig文件是

<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd">


<context:component-scan base-package="controllers,dao" />
<tx:annotation-driven transaction-manager="transactionManager"/>



  <!-- 
     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
        <tx:attributes>  
            <tx:method name="*"  />  
        </tx:attributes>  
    </tx:advice>     -->

 <bean id="viewResolver"
           class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
           <property name="prefix">
              <value>/WEB-INF/pages/</value>
           </property>
           <property name="suffix">
              <value>.jsp</value>
           </property>
     </bean>

 <bean
    id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

    <property name="configLocation">    
        <value>
            classpath:hibernate.cfg.xml
        </value>
    </property>

    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
                <prop key="hibernate.show_sql">true</prop>
                <!-- <prop key="hibernate.c3p0.min_size">5</prop>
                <prop key="hibernate.c3p0.max_size">20</prop>
                <prop key="hibernate.c3p0.timeout">300</prop>
                <prop key="hibernate.c3p0.max_statements">50</prop>
                <prop key="hibernate.c3p0.idle_test_period">3000</prop>  -->
            </props>
     </property>
</bean>    

<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/foodcartdb" />
    <property name="username" value="root" />
    <property name="password" value="root" />

</bean>

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

</beans>

/WEB-INF/pages/
.jsp
类路径:hibernate.cfg.xml
org.hibernate.dialogue.mysqldialogue
org.springframework.orm.hibernate4.SpringSessionContext
真的
这是我保存数据的代码

package dao;


import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
//import org.springframework.orm.hibernate4.support.HibernateDaoSupport;

import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class GenericDaoImpl<T> implements GenericDao<T> {

    /*public GenericDaoImpl(){
        //Do Also Nothing here ha ha ha
    }
    //@Autowired
    public GenericDaoImpl(SessionFactory sessionFactory){
        super.setSessionFactory(sessionFactory);
    }*/
    /*@Autowired
    protected void init(SessionFactory sessionFactory) {
        super.setSessionFactory(sessionFactory);
    }*/

    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;

    public Session getSession() {
        return sessionFactory.getCurrentSession();
    }
    @Override
    public void save(T t) {
        // TODO Auto-generated method stub
        //getHibernateTemplate().save(t);
        this.sessionFactory.getCurrentSession().save(t);
    }

    @Override
    public void update(T t) {
        // TODO Auto-generated method stub
        //getHibernateTemplate().update(t);
        getSession().update(t);
    }

    @Override
    public void delete(T t) {
        // TODO Auto-generated method stub
        //getHibernateTemplate().delete(t);
        getSession().delete(t);
    }

}
包dao;
导入org.hibernate.Session;
导入org.hibernate.SessionFactory;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.beans.factory.annotation.Qualifier;
导入org.springframework.context.annotation.Configuration;
//导入org.springframework.orm.hibernate4.support.HibernateDaoSupport;
导入org.springframework.stereotype.Repository;
导入org.springframework.stereotype.Service;
导入org.springframework.transaction.annotation.EnableTransactionManagement;
@配置
@启用事务管理
公共类GenericDaoImpl实现GenericDao{
/*公共通用DAOImpl(){
//在这里也什么都不做哈哈哈
}
//@自动连线
公共通用DAOImpl(SessionFactory SessionFactory){
超级会话工厂(会话工厂);
}*/
/*@自动连线
受保护的void init(SessionFactory SessionFactory){
超级会话工厂(会话工厂);
}*/
@自动连线
@限定符(“会话工厂”)
私人会话工厂会话工厂;
公共会话getSession(){
返回sessionFactory.getCurrentSession();
}
@凌驾
公共无效保存(T){
//TODO自动生成的方法存根
//getHibernateTemplate().save(t);
this.sessionFactory.getCurrentSession().save(t);
}
@凌驾
公共无效更新(T){
//TODO自动生成的方法存根
//getHibernateTemplate().update(t);
getSession().update(t);
}
@凌驾
公共作废删除(T){
//TODO自动生成的方法存根
//getHibernateTemplate().delete(t);
getSession().delete(t);
}
}

请有人帮我找出哪里出了问题,我花了将近半天的时间来解决这个问题。

我认为您应该在DAO类上使用
@Transactional
,在单个配置类上使用
@Configuration
/
@EnableTransactionManagement
,不在每个DAO上。

尝试使用
@Repository
注释,而不是
@Configuration
@EnableTransactionManagement

@Repository
public class GenericDaoImpl<T> implements GenericDao<T> {
    // code goes here
}
@存储库
公共类GenericDaoImpl实现GenericDao{
//代码在这里
}
@Repository

在Spring2.0及更高版本中,@Repository注释是 完成角色或原型(也称为数据)的任何类 访问存储库的对象(或DAO)。在这个标记的用途中 是异常的自动翻译


首先,在
GenericDaoImpl
类上组合的
@Configuration
@EnableTransactionManagement
注释是多余的,因为您已经在Spring XML配置文件中启用了注释驱动的事务管理

其次,
GenericDaoImpl
应注释为
@Repository

第三,你没有发布你的
UserDao
类。它是否继承了
GenericDaoImpl
?如果是这样,考虑制作<代码> GynDaDoIMPL/<代码>抽象类(然后只有<代码> @存储库< /代码>应该是<代码> UserDao < /COD>单独)。 第四,为了获得会话,您必须将该方法注释为
@Transactional
,或者使用。使用
@Transactional
可以让Spring处理处理打开/关闭会话的样板代码,但强制您在方法的整个范围内呈现单个事务。为自己打开一个会话可以更好地控制会话管理,但相当繁琐

第五,如果
UserDao
继承了
GenericDaoImpl
,那么在
save
方法上使用
@Transactional
是无用的,因为(默认情况下)这样的注释只适用于通过bean接口执行的方法调用。因为在这里使用继承是一种不好的做法,所以您应该删除它并调用
session.save(t)
inside
UserDao
本身

最后也是最不重要的一点,作为旁注,最好使用注释进行依赖项注入,例如和(分别替换
@Autowire
@Qualifier