本文介绍了没有活动事务,CreateQuery无效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Spring @Transactional注释,但在调用方法 findAll 时遇到问题,并且出现此错误:

  org.hibernate.HibernateException:的createQuery也不是没有在org.hibernate.context.internal.ThreadLocalSessionContext $ TransactionProtectionWrapper.invoke活动事务
有效(ThreadLocalSessionContext.java:352)
at com.sun.proxy $ Proxy57.createQuery(Unknown Source)
at org.munaycoop.taskmanager.daos.PersonDataAccesObject.findAll(PersonDataAccesObject.java:20)
at org.munaycoop .taskmanager.services.PersonService.findAll(PersonService.java:26)
at org.munaycoop.taskmanager.controllers.PersonController.ShowAllPersons(PersonController.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessor Impl.java:43)
在java.lang.reflect.Method.invoke(Method.java:606)
在org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:在org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132 215)

。在org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle( ServletInvocableHandlerMethod.java:104)
处org.springframework.web.servlet.mvc org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
。 method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
处org.springframework org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
。 web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
在org.sprin gframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
处org.springframework.web org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
。 servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at org.springframework.web.servlet.FrameworkServlet.service( FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)在org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
在org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)

在org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
在org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
在org.mortbay .jetty.webapp.WebAppContext.handle(WebAppContext.java:4 40)
。在org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
。在org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay .jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection $ RequestHandler.headerComplete(HttpConnection.java:926)
at org.mortbay.jetty.HttpParser.parseNext (HttpParser.java:549)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)$在org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)b
$ b。在org.mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:582)

Person DAO:

  @Repositor y 
@Transactional
public class PersonDataAccesObject implements IPersonDataAccesObject {
$ b $ @Autowired
private SessionFactory session;

@Override
public List findAll(){
return session.getCurrentSession()。createQuery(from persons)。list();
}

这是我的 servlet-context.xml



  <! - 启用Spring MVC @Controller编程模型 - > 
< annotation-driven />

< resource mapping =/ resources / **location =/ resources / bootstrap //>

< context:property-placeholder location =classpath:database.properties/>

< beans:bean id =dataSourceclass =org.springframework.jdbc.datasource.DriverManagerDataSource>
< beans:property name =driverClassNamevalue =$ {jdbc.driverClassName}/>
< beans:property name =urlvalue =$ {jdbc.databaseUrl}/>
< beans:property name =usernamevalue =$ {jdbc.username}/>
< beans:property name =passwordvalue =$ {jdbc.password}/>
< / beans:bean>

< beans:bean id =sessionFactoryclass =org.springframework.orm.hibernate4.LocalSessionFactoryBean>
< beans:property name =dataSourceref =dataSource/>

< beans:property name =hibernateProperties>
< beans:道具>
< beans:prop key =hibernate.connection.pool_size> $ {hibernate.pool_size}< / beans:prop>
< beans:prop key =hibernate.dialect> $ {hibernate.dialect}< / beans:prop>
< beans:prop key =hibernate.current_session_context_class> $ {hibernate.current_session}< / beans:prop>
< beans:prop key =hibernate.cache.provider_class> $ {hibernate.provider_class}< / beans:prop>
< beans:prop key =hibernate.show_sql> $ {hibernate.show_sql}< / beans:prop>
< beans:prop key =hibernate.hbm2ddl.auto> $ {hibernate.hbm2ddl}< / beans:prop>
< / beans:道具>
< / beans:property>

< beans:property name =mappingResources>
< beans:list>
< beans:value> hibernate.cfg.xml< / beans:value>
< / beans:list>
< / beans:property>
< / beans:bean>

< beans:bean id =transactionManagerclass =org.springframework.orm.hibernate4.HibernateTransactionManager>
< beans:property name =sessionFactoryref =sessionFactory/>
< / beans:bean>

我尝试删除这行< beans:prop key =hibernate。 current_session_context_class> $ {hibernate.current_session}< / beans:prop> ,但是又出现了一个错误,为什么这不起作用?

解决方案

您必须显式声明对事务管理器注解的支持



添加到您的配置:

 < tx:注解驱动的事务管理器=transactionManager/> 



是xmlns:tx =http://www.springframework.org/schema/tx



并删除此行:

 < beans: prop key =hibernate.current_session_context_class> $ {hibernate.current_session}< / beans:prop> 


I'm trying to use the Spring @Transactional annotation, but i have problems when the method findAll is called and i have this error:

  org.hibernate.HibernateException: createQuery is not valid without active transaction
  at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
  at com.sun.proxy.$Proxy57.createQuery(Unknown Source)
  at org.munaycoop.taskmanager.daos.PersonDataAccesObject.findAll(PersonDataAccesObject.java:20)
  at org.munaycoop.taskmanager.services.PersonService.findAll(PersonService.java:26)
  at org.munaycoop.taskmanager.controllers.PersonController.ShowAllPersons(PersonController.java:20)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:606)
  at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
  at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
  at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
  at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
  at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
  at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
  at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
  at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
  at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
  at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
  at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
  at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:440)
  at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
  at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
  at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
  at org.mortbay.jetty.Server.handle(Server.java:326)
  at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
  at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:926)
  at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
  at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
  at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
  at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
  at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

the Person DAO:

@Repository
@Transactional
public class PersonDataAccesObject implements IPersonDataAccesObject {

    @Autowired
    private SessionFactory session;

    @Override
    public List findAll() {
        return session.getCurrentSession().createQuery("from persons").list();
    }

and this is my servlet-context.xml:

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/bootstrap/" />

<!-- Database Configuration -->
<context:property-placeholder location="classpath:database.properties" />

<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="${jdbc.driverClassName}" />
    <beans:property name="url" value="${jdbc.databaseUrl}" />
    <beans:property name="username" value="${jdbc.username}" />
    <beans:property name="password" value="${jdbc.password}" />
</beans:bean>

<!-- Hibernate session factory -->
<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <beans:property name="dataSource" ref="dataSource"/>

    <beans:property name="hibernateProperties">
        <beans:props>
            <beans:prop key="hibernate.connection.pool_size">${hibernate.pool_size}</beans:prop>
            <beans:prop key="hibernate.dialect">${hibernate.dialect}</beans:prop>
            <beans:prop key="hibernate.current_session_context_class">${hibernate.current_session}</beans:prop>
            <beans:prop key="hibernate.cache.provider_class">${hibernate.provider_class}</beans:prop>
            <beans:prop key="hibernate.show_sql">${hibernate.show_sql}</beans:prop>
            <beans:prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl}</beans:prop>
        </beans:props>
    </beans:property>

    <beans:property name="mappingResources">
        <beans:list>
            <beans:value>hibernate.cfg.xml</beans:value>
        </beans:list>
    </beans:property>
</beans:bean>

<!-- Hibernate TransactionManager -->
<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <beans:property name="sessionFactory" ref="sessionFactory"/>
</beans:bean>

I tried removing this line <beans:prop key="hibernate.current_session_context_class">${hibernate.current_session}</beans:prop>, but another error has came, why this is not working?

解决方案

You have to explicitly declare support for transaction manager annotation

Add to your config:

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

tx is xmlns:tx="http://www.springframework.org/schema/tx" namespace.

and delete this line:

<beans:prop key="hibernate.current_session_context_class">${hibernate.current_session}</beans:prop>

这篇关于没有活动事务,CreateQuery无效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-04 06:47
查看更多