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

时间:2014-11-28 09:52:35

标签: hibernate

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

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)

如何解决上述异常。

上面的hibernate代码是正确的,额外的+/-应该是什么,以使这个代码完美。

很少有方法抛出相同的异常,但在2,3请求之后它们正常工作如何解决这个问题。

我正在使用mysql数据库。

1 个答案:

答案 0 :(得分:-1)

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

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