2013-05-10 90 views
2

我寫DAO在春季爲我所用的支柱寫一些這樣想春天Hibernate事務不能提交

@Autowired 
    private SessionFactory sessionFactory; 
    Session session=null; 
    Transaction tx=null; 
    List<Login> users= null; 
    try{ 
     session=sessionFactory.getCurrentSession(); 
     tx=session.beginTransaction(); 
     users=session.createQuery("from Login").list(); 
     tx.commit(); 
    }catch(Exception e){System.out.println("commit exception:"+e); 
     try {tx.rollback();} catch (Exception ex) {System.out.println("rollback exception:"+ex);} 
    }finally{if(session!=null && session.isOpen()){session.close();}} 

,但我得到這個錯誤:

threw exception [Request processing failed; nested exception is org.springframework.transaction.TransactionSystemException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started] with root cause org.hibernate.TransactionException: Transaction not successfully started

可以

人請幫助我。

如果我這樣寫吧,

try{ 
      users=sessionFactory.getCurrentSession().createQuery("from Login").list(); 
     }catch(Exception e){System.out.println("commit exception:"+e); 

其做工精細,但它是安全的?

感謝和問候

+0

爲什麼你要啓動,提交和回滾事務而不是讓Spring使用AOP來執行它?我的猜測是,你也在使用Spring AOP來完成它,而編程事務處理正在干擾Spring自己的事務處理。 – 2013-05-10 21:17:31

+0

你已使用@transactional服務。那麼這是最好的方法嗎? – Aadam 2013-05-11 04:28:44

回答

3

您使用@事務,有春天開始,爲你提交和回滾事務,並聲明處理您的交易。這完全是爲了不必在代碼中啓動,提交和回滾事務。所以方法的實現應該簡單地是

return (List<Login>) sessionFactory.getCurrentSession().createQuery("from Login").list();