2013-04-02 54 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