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

org.hibernate.TransactionException:获取数据时不支持嵌套事务,hibernate,Hibernate,我使用以下代码从数据库中获取数据 public Map fetchAll(int start, int pageSize, Long cid) { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); Transaction tx = session.beginTransaction(); List<Expense> expense = null

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

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;
    }
如何解决上述异常

上面的hibernate代码是正确的,应该有多少额外的+/-使这个代码完美

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


我正在使用mysql数据库。

您可以从session.beginTransaction更改事务;到session.getTransaction

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;
    }

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

我使用的是mysql数据库