我做了很多研究,但我在这里没有得到解决方案,我的错误是
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>
这是我保存数据的代码
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);
}
}
请谁来帮我解决我哪里搞错了,我已经花了大半天的时间来解决这个问题。
发布于 2013-08-02 07:44:20
尝试使用@Repository
注释,而不是@Configuration
和@EnableTransactionManagement
...
@Repository
public class GenericDaoImpl<T> implements GenericDao<T> {
// code goes here
}
@Repository
API DOCS here
在Spring2.0和更高版本中,@Repository注释是实现存储库的角色或构造型(也称为数据访问对象或DAO)的任何类的标记。此标记的用途之一是自动转换异常。
Spring documentation here
发布于 2013-08-02 08:09:19
首先,在GenericDaoImpl
类上组合使用@Configuration
和@EnableTransactionManagement
注释是多余的,因为您已经在Spring XML配置文件中启用了注释驱动的事务管理。
其次,应该将GenericDaoImpl
注释为@Repository
。
第三,你没有发布你的UserDao
类。它继承了GenericDaoImpl
吗?如果是这样的话,考虑创建GenericDaoImpl
抽象类(然后唯一的@Repository
应该是UserDao
本身)。
第四,为了获得会话,您必须将该方法注释为@Transactional
或使用sessionFactory.openSession()
。使用@Transactional
让Spring负责处理打开/关闭会话的样板代码,但强制您在整个方法范围内拥有一个当前的单个事务。为自己打开一个会话可以更好地控制会话管理,但相当繁琐。
第五,如果UserDao
继承了GenericDaoImpl
,那么在save
方法上使用@Transactional
是无用的,因为(缺省情况下)这样的批注只适用于通过bean的接口执行的方法调用。因为在这里使用继承是一种糟糕的做法,所以您应该删除它并在UserDao
内部调用session.save(t)
。
最后,也是最不重要的,作为附注,最好使用javax.inject注解进行依赖注入,比如@Inject
和@Named
(分别替换@Autowire
和@Qualifier
)。
发布于 2013-08-02 06:03:51
我认为您应该在DAO类上使用@Transactional
,在单个配置类上使用@Configuration
/@EnableTransactionManagement
,而不是在每个DAO上使用。
https://stackoverflow.com/questions/18005294
复制相似问题