2014-02-11 56 views
0

我是新來的休眠,並試圖堅持一個簡單的對象在數據庫中。數據被保存在表中,但隨後下列拋出異常。 引起:org.hibernate.TransactionException:交易未成功開始如何解決這個異常??引起:org.hibernate.TransactionException:事務沒有成功啓動

這是我的代碼,請幫忙!

@Transactional 
public void addEmployee(Employee empObj) { 
    System.out.println(">>>>>>>>>>>in DAO"); 

    Transaction tx = null; 
    Session session=sessionFactory.getCurrentSession(); 

    try{ 
    tx=session.beginTransaction(); 
    session.save(empObj); 
    tx.commit(); 
    } 

    catch (HibernateException e) { 
     if (tx!=null) 
      tx.rollback(); 
     e.printStackTrace(); 
     } 

} 

回答

0

所有你需要做的就是改變你的方法代碼如下:

@Transactional 
public void addEmployee(Employee empObj) { 
    Session session=sessionFactory.getCurrentSession(); 
    session.save(empObj); 
} 

如果您確實配置的Hibernate和Spring - 我猜你有,從異常判斷 - 然後一個Hibernate平臺事務管理器攔截方法調用(暗示爲@Transactional)並自動爲您啓動事務。由於交易已經在該會話中打開,因此無法打開新交易。

+0

是它的工作,謝謝!現在請你向我解釋何時使用@Transactional?我的代碼有什麼問題? –

+0

@Transactional處理自動提交和回滾?事務結束後,是否需要關閉會話? –

+0

當您使用'@ Transactional'時,如所述,Spring會在方法調用之前爲您打開一個,並在方法結束時提交(如果發生異常,通常會回滾)。把它看作好像Spring在方法調用之前調用'session.beginTransaction()',之後調用'tx.commit(); –

0

這是因爲您正在混合hibernate和spring事務。 @Transaction是Spring AOP和劑量自動事務處理的一部分。您必須在代碼中只使用一種交易類型,您可以刪除其中的一種。

相關問題