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