我正在使用以下代码从数据库中获取数据。
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数据库。
答案 0 :(得分:-1)
您可以将交易从session.beginTransaction();
更改为session.getTransaction();
注意:同样取决于您的数据库是否支持netsted事务