我随机收到这个休眠错误,我无法重现它。
已经有关联的托管连接
和堆栈跟踪如下......
INFO | jvm 1 | 2013/03/31 18:16:20 | org.hibernate.TransactionException: Transaction not successfully started
INFO | jvm 1 | 2013/03/31 18:16:20 | at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:170)
INFO | jvm 1 | 2013/03/31 18:16:20 | at com.xxx.sss.helpers.HibernateUtil.getObjectsByCriteria(HibernateUtil.java:54)
我的选择方法是:
public static ArrayList<?> getObjectsByCriteria(String sqlQuery, List<Object> params, int firstResult, int maxSize)
{
ArrayList<Object> result = null;
try
{
SessionFactoryHelper.getSessionFactory().getCurrentSession().getTransaction().begin();
Query q = SessionFactoryHelper.getSessionFactory().getCurrentSession().createQuery(sqlQuery);
if(params != null)
{
for (int i = 0; i < params.size(); i++)
{
q.setParameter(i, params.get(i));
}
}
if(firstResult != -1 && maxSize != -1)
{
q.setFirstResult(firstResult);
q.setMaxResults(maxSize);
}
q.setReadOnly(true);
result = (ArrayList<Object>) q.list();
}
catch(HibernateException ex)
{
logger.log(Level.SEVERE, ex.getMessage());
logQueryAndParams(sqlQuery, params);
}
catch(Exception ex)
{
logger.log(Level.SEVERE, ex.getMessage());
logQueryAndParams(sqlQuery, params);
}
finally
{
if(!SessionFactoryHelper.getSessionFactory().getCurrentSession().getTransaction().wasCommitted())
SessionFactoryHelper.getSessionFactory().getCurrentSession().getTransaction().commit();
}
return result;
}
知道我为什么会这样吗?我用谷歌搜索了,但回复很少。我没有直接使用Spring Tomcat / Hibernate。
谢谢!
答案 0 :(得分:0)
一方面,Hibernate的Session类有两个非常重要但又截然不同的方法。一个是session.createQuery()
createQuery()方法使用映射到数据库表的Java对象在数据库上执行HQL(Hibernate查询语言)语句。
但是,在上面的方法中查看您的参数名称,似乎您正在执行SQL查询;不是HQL查询。因此,必须使用Session类提供的替代方法:
session.createSQLQuery()
因此,如果您在数据库上执行SQL查询而不是HQL查询,那么您的代码将如下所示:
Query q = SessionFactoryHelper.getSessionFactory().getCurrentSession().createSQLQuery(sqlQuery);
希望这会有所作为。
答案 1 :(得分:0)
我注意到,如果出现错误(在catch
块内),您永远不会回滚事务。我不确定这是否是你问题的原因。此外,处理事务的常用方法是在try
块结束时进行提交,而不是在finally
块中进行提交,因为如果存在,则不希望调用commit
是一个错误。 Here's an example
答案 2 :(得分:0)
此错误表示您已在JDBC连接上运行事务 问题可能是因为你可能正在使用的@PersistenceContext注释
替换 @PersistenceContext(type = PersistenceContextType.EXTENDED)
与 @PersistenceContext(type = PersistenceContextType.TRANSACTION) 要么 @PersistenceContext