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.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1024)

at com.fexco.shoptaxfreemobile.service.ProfileService.registerVisitor(ProfileService.java:57)

at com.fexco.shoptaxfreemobile.controller.ProfileController.registerVisitor(ProfileController.java:91)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)

at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)

at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)

at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)

at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)

at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)

at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)

at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)

at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at com.fexco.shoptaxfreemobile.jsonp.JsonpCallbackFilter.doFilter(JsonpCallbackFilter.java:33)

at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)

at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:619)

服务等级

@Service

public class ProfileService {

@Resource(name = "mySessionFactory")

private SessionFactory sessionFactory;

@Autowired

private ProfileDao profileDao;

private class CountrySorter implements Comparator<Country> {

@Override

public int compare(Country country1, Country country2) {

if ( country1.getId().compareTo(new Long (3)) < 0){

return country1.getId().compareTo(country2.getId());

}

return country1.getName().compareToIgnoreCase(country2.getName());

}

}

public List<Country> getCountries() {

List<VisitorCountry> visitorCountries = profileDao.getAllCountries();

List<Country> countries = new ArrayList<Country>();

for ( VisitorCountry country : visitorCountries){

countries.add(country.getCountry());

}

Comparator<Country> comparator = new CountrySorter();

Collections.sort(countries, comparator);

return countries;

}

public RegisterResponse registerVisitor(JsonVisitor visitorDetails){

Visitor storedVisitor = (Visitor) sessionFactory.getCurrentSession().get(Visitor.class, visitorDetails.getTfscNumber(), LockMode.NONE);

if ( storedVisitor == null){

storedVisitor = new Visitor(visitorDetails);

}else{

storedVisitor.setVisitorDetails(visitorDetails);

}

try{

sessionFactory.getCurrentSession().saveOrUpdate(storedVisitor);

}catch(Exception ex){

return new RegisterResponse(false, "Failed To Register Card. Please Try Again Later.", visitorDetails);

}

return new RegisterResponse(true, "", visitorDetails);

}

}

DAO类

@Service

@Transactional

public class ProfileDao {

@Resource(name = "mySessionFactory")

private SessionFactory sessionFactory;

public List getAllCountries(){

List<VisitorCountry> visitorCountries = sessionFactory.getCurrentSession()

.getNamedQuery("GET_ALL_COUNTRIES").list();

return visitorCountries;

}

public List<Retailer> getRetailerByRetailerNumber(String retailerNo) {

List<Retailer> retailerByRetailerNumber = sessionFactory.getCurrentSession()

.getNamedQuery("FindRetailerByRetailerNo").setString("retailerNo", retailerNo).list();

return retailerByRetailerNumber;

}

我在我的application-context.xml中有这个

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

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

<property name="dataSource" ref="myDataSource" />

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

<property name="hibernateProperties">

<value>

<![CDATA[

hibernate.show_sql=true

hibernate.format_sql=true

hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider

]]>

</value>

</property>

</bean>

谁能看出我为什么收到以下错误?

回答:

你使用@Transactional为Dao类添加了注释,但没有为服务类添加注释。该行:

Visitor storedVisitor =

(Visitor) sessionFactory.getCurrentSession().get(Visitor.class,

visitorDetails.getTfscNumber(), LockMode.NONE);

要求你进行交易。

以上是 Spring和Hibernate:找不到当前线程的会话 的全部内容, 来源链接: utcz.com/qa/400928.html

回到顶部