org.hibernate.TransactionException:获取数据时不支持嵌套事务

Posted

技术标签:

【中文标题】org.hibernate.TransactionException:获取数据时不支持嵌套事务【英文标题】:org.hibernate.TransactionException: nested transactions not supported while fetching data 【发布时间】:2014-11-28 09:52:35 【问题描述】:

我正在使用以下代码从数据库中获取数据。

public Map fetchAll(int start, int pageSize, Long cid) 
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        List<Expense> expense = null;
        long count = 0;
        try 
            count = (Long) session.createQuery("select count(*) from Expense where client.id=:cid")
                    .setParameter("cid", cid).uniqueResult();
            String hql = "select s from Expense s where s.client.id=:cid order by adddate desc ";
            Query query = session.createQuery(hql).setFirstResult(start).setMaxResults(pageSize);
            query.setParameter("cid", cid);
            expense = query.list();
            tx.commit();

         catch (HibernateException e) 
            LogError.log(new Throwable().getStackTrace()[0].getClassName(), new Throwable().getStackTrace()[0].getMethodName(), "", e.toString());
            if (tx != null) 
                e.printStackTrace();
            
         
        Map data = new HashMap();
        data.put("list", expense);
        data.put("count", count);
        return data;
    

此代码抛出以下异常:

org.hibernate.TransactionException: nested transactions not supported
    org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:154)
    org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1435)
    sun.reflect.GeneratedMethodAccessor120.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:483)
    org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:356)
    com.sun.proxy.$Proxy17.beginTransaction(Unknown Source)
    iland.expense.ExpenseDAO.fetchAll(ExpenseDAO.java:167)
    iland.expense.ExpenxeAction.fetchAll(ExpenxeAction.java:171)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:483)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
    com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
    com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)

如何解决上述异常。

以上休眠代码是正确的,应该有什么额外的 +/- 以使此代码完美。

很少有其他方法会抛出相同的异常,但在 2,3 次请求后它们可以正常工作如何解决此问题。

我正在使用mysql数据库。

【问题讨论】:

【参考方案1】:

您可以将交易从session.beginTransaction();更改为session.getTransaction();

注意:同样取决于您的数据库是否支持 netsted 事务

【讨论】:

我正在使用mysql数据库

以上是关于org.hibernate.TransactionException:获取数据时不支持嵌套事务的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的缓存是在何时清除的?

tomcat的报错问题