2013-04-02 31 views
0

我随机接收这个休眠错误,我无法重现它。休眠错误 - 已经有一个关联的托管连接

已经有一个相关的管理连接

和堆栈跟踪如下...

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

任何想法,为什么我得到这个?我已经使用了Google,但只有很少的回复。我没有直接使用Spring直接升级Tomcat/Hibernate。

谢谢!

回答

0

一方面,Hibernate的Session类有两个非常重要,但不同的方法。一个是session.createQuery() createQuery()方法使用映射到数据库表的Java对象在数据库上执行HQL(Hibernate查询语言)语句。

但是,在上面的方法中查看您的参数名称,似乎您正在执行SQL查询;不是HQL查询。因此,必须使用会话类提供的另一种方法:

session.createSQLQuery() 

因此,如果你的数据库,而不是一个HQL查询上执行一个SQL查询,那么你的代码将如下所示:

Query q = SessionFactoryHelper.getSessionFactory().getCurrentSession().createSQLQuery(sqlQuery); 

希望这会有所作为。

+0

感谢您的响应。对不起,它们都是HQL查询=)我只是一个命名不定的变量。 – Graeme

0

我注意到,如果发生错误(在catch块内),您从不回滚事务。我不确定这是不是你的问题的原因。另外,处理事务的通常方法是在try块的末尾执行提交,而不是在finally块中执行提交,因为如果出现错误,则不想调用commitHere's an example

0

这个错误意味着你已经有你的JDBC连接 上运行的事务的问题,可能是因为@PersistenceContext注解,你可以使用

更换 @PersistenceContext(类型= PersistenceContextType.EXTENDED)

与 @PersistenceContext(类型= PersistenceContextType.TRANSACTION) 或 @PersistenceContext