当前位置: 首页 > 面试题库 >

没有活动的事务,CreateQuery无效

南门洋
2023-03-14
问题内容

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

  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)

人DAO:

@Repository
@Transactional
public class PersonDataAccesObject implements IPersonDataAccesObject {

    @Autowired
    private SessionFactory session;

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

这是我的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>

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


问题答案:

您必须明确声明对事务管理器注释的支持

添加到您的配置中:

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

tx是xmlns:tx =“ http://www.springframework.org/schema/tx”命名空间。

并删除此行:

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


 类似资料:
  • 问题内容: 我正在创建应用程序并在其中使用一些hibernate的东西。我要做的就是将实体保存到数据库中,但我不断收到此异常: 起初,我遇到了这个异常: 然后,我发现需要将其添加到我的hibernate配置中: 这解决了这个问题,但是现在出现了上面的问题。我将实体保存到这样的数据库中: 我的hibernate.cfg.xml文件如下所示: 我在用: Hibernate-4.1.4.Final JD

  • 问题内容: 我正在尝试使用Spring @Transactional批注,但是在调用 findAll 方法时出现问题,并且出现以下错误: 人DAO: 这是我的: 我尝试删除此行,但是又出现了一个错误,为什么这行不通? 问题答案: 您必须显式声明对事务管理器注释的支持 添加到您的配置中: tx是xmlns:tx =“ http://www.springframework.org/schema/tx”

  • 我想将我的axis2项目与spring集成在一起。我按照本指南加载了一个spring applicationContext。 https://axis.apache.org/axis2/java/core/docs/spring.html 简而言之 以下是我的axis2版本服务: 问题:当轴调用 getResponse() 方法时,dao 设法获取注入的会话工厂(和Hibernate会话),但是当

  • 问题内容: 我正在通过遵循一个教程来研究示例Spring Hibernate示例,并且陷入了异常说 这是我的代码: Person.java- 简单的POJO person.hbm.xml- 映射文件 PersonDao.java- 我的DAO类 PersonService.java- 服务层 spring-config.xml -Spring配置文件: 最后是我的 主程序-MainApp.java

  • 问题内容: 我是hibernate的新手。 自动创建的hibernate.cfg.xml(Netbeans向导) 自动创建的HibernateUtil.java 自动创建带有注释的POJO类 尝试从数据库获取对象但出现错误: 得到一个对象: hibernate.cfg.xml 问题答案: 加 //此语句将启动交易 就在你的 然后在交易结束时通过调用提交更改。

  • java.lang.IllegalStateException:org.hibernate.transientPropertyValueException:object引用了一个未保存的瞬态实例-在刷新之前保存瞬态实例:entity.customer.passport->entity.passport 注意:如果我在实体类中使用CascadeType.Persist,我可以在DB中插入另一行。