1. 程式人生 > >Hibernate 錯誤解決(TransactionException: Transaction not successfully started)

Hibernate 錯誤解決(TransactionException: Transaction not successfully started)

【關鍵的錯誤資訊】: TransactionException: Transaction not successfully started 和一個doCommit

從該關鍵字看,是使用Hibernate事務管理器(而不是Spring,下面詳細log的綠色字型)處理事務的commit時丟擲的,

【具體解決】:

      //下面的程式碼段會報錯

        Session session =  getSessionFactory().getCurrentSession();  
        session.beginTransaction();          //
        String queryString = "update.... "; //具體資料庫欄位內容的更新
        Query query = session.createQuery(queryString);         
        query.executeUpdate();  
        session.getTransaction().commit(); //應該是這裡導致了 org.hibernate.TransactionException: Transaction not successfully started


//改為下面的程式碼段好了
	Session session =  getSessionFactory().openSession();  
        Transaction tran = session.beginTransaction();   //這麼修改後,ok
        String queryString = "update ....";
        Query query = session.createQuery(queryString);  
        query.executeUpdate();  
        tran.commit(); 
        session.close();




【事後諸葛亮】該錯誤在dao層的一個執行update的語句裡面,但該處沒有提示錯誤,而是在呼叫這個函式的上一級函式要return時丟擲的。

1.  可能是session結束時的檢查。

2.  沒有申請transaction物件,直接使用函式導致了錯誤?

3.  而且雖然最後報錯,但事實上已經成功的修改了資料庫(持久化已經完成)。

4.  生搬硬套固然能快速實現,理解透徹才是正道。

5.  這麼改可能會影響執行時間,多資料量時可能需要優化。

附:詳細的stacktrace:

org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started


at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:660)

Caused by: org.hibernate.TransactionException: Transaction not successfully started
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:130)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)
... 77 more