当前位置: 首页 > 知识库问答 >
问题:

Hibernate java.lang.IllegalStateException:事务已处于活动状态

权弘新
2023-03-14

问题涉及的方法是:

// The caller method
Pic p = picDAO.getById(1000);


// The Hibernate method
@Override
public Pic getById(Integer id) throws BDException {
    Session session = sessionFactory.getCurrentSession();
    Transaction tx = session.getTransaction();
    try {
        tx.begin();
        Pic p = (Pic) session.get(myClass, id);
        tx.commit();
        return p;
    }
    catch(........) {
        // Exceptions here
    }
}

编辑。以下是完整的堆栈跟踪(一些消息是西班牙语的):

12-Nov-2021 09:30:43.875 GRAVE [http-nio-8080-exec-10] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() para servlet [ViewPic] lanzó excepción
        java.lang.IllegalStateException: Transaction already active
                at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:74)
                at project.dao.DAOGeneric.getById(DAOGeneric.java:268)
                at project.controller.forwards.ViewPic.processRequest(ViewPic.java:86)
                at project.controller.MainServlet.doGet(MainServlet.java:38)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
                at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
                at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
                at project.controller.filters.TileConfigFilter.doFilter(TileConfigFilter.java:58)
                at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
                at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
                at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
                at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
                at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
                at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
                at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
                at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
                at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:769)
                at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
                at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
                at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)
                at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)
                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
                at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
                at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
                at java.base/java.lang.Thread.run(Thread.java:829)

共有1个答案

蒲勇
2023-03-14

我看了一下堆栈跟踪,它说一个事务已经处于活动状态,您正在尝试打开一个新的事务。

这个交易在哪里,它当时已经打开了?

  at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:74)
                at project.dao.DAOGeneric.getById(DAOGeneric.java:268)
                at project.controller.forwards.ViewPic.processRequest(ViewPic.java:86)
                at project.controller.MainServlet.doGet(MainServlet.java:38)

它必须在这里的某个地方打开(下面的所有内容都是系统类,在您的控制之外),要么显式地(通过方法调用),要么隐式地(@Transactional annotation或类似的)

 类似资料:
  • 我有一个带有唯一约束的字段'nom'的表,当我测试插入表中已经存在的该字段的值时,会抛出org.hibernate.exception.ConstraintViolationExcure。然后在我坚持之后,我得到了一个事务已经活动的异常。 这是我在Dao类中的持久化方法 这里是我捕获异常的代码 如何解决此事务问题?

  • 问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些

  • 那么我应该做些什么来实现这个目标呢?如有任何帮助/线索,请提前感谢

  • 我需要检查FTP服务器是否处于活动状态,此服务器是否: 我尝试了这段代码: 问题是返回以下异常: 如何才能做到这一点呢? 谢谢你

  • 我计划为 EJB 编写一个拦截器,它基本上可以执行以下操作: 问题是,如果em.flush()应用于用@TransactionAttribute(NOT _ SUPPORTED)或@TransactionAttribute(SUPPORTS)注释的方法(即只读方法),它会引发异常,而它在使用默认@ transaction attribute(必需)的方法(即更改数据库的方法)时工作良好。 有没有办

  • 问题内容: 因此,我正在使用下载管理器在我的应用程序中下载多个文件。开始某些活动之前,我需要这些文件才能完成下载。如何检查是否有活动的下载,所以我可以告诉用户等待下载完成。然后,当它们完成时,我需要使按钮可见。我已经用谷歌搜索过,甚至自己(盲目地)尝试了一些代码,但没有任何效果。如果有人可以向正确的方向推动我,我将不胜感激。 问题答案: 使用打听下载。调用时,返回值是下载的ID。您还可以按状态查询