2014-06-18 77 views
0

使用Spring sessionFactory注入。春天不給當前會話沒有標記@Transactional

@SuppressWarnings("unchecked") 
    public void getData() { 
     System.out.println("%%%% Hibernate fetching data %%%% "); 
     Session session = factory.getCurrentSession(); 
     /* 
     * try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO 
     * Auto-generated catch block e.printStackTrace(); } 
     */ 
     List<Address> addresses = session.createQuery("from Address").list(); 
     System.out.println("Total Connectins = " 
       + factory.getStatistics().getConnectCount()); 
     for (Address address : addresses) { 
      System.out.println(address); 
     } 
    } 

上面的代碼是給異常

org.hibernate.HibernateException: No Session found for current thread 

但是,當這種方法被標記爲@Transactional 它的正常工作。 但我不希望爲此方法啓用任何事務。

我錯過了什麼..?

回答

1

這就是交易如何工作。通過標記該方法@Transactional,您要求TransactionManager創建並開始新交易,並使用SessionFactory中的新交易會話。沒有事務,Hibernate不會在數據庫中創建一個Session。它創建Transaction的原因是,如果出現問題,Hibernate可以輕鬆地回滾在一個事務中執行的操作。

沒有@Transactional,Hibernate假定你不需要與數據庫交互。我建議在繼續之前閱讀Spring documentation,因爲您對這項技術的工作原理似乎很困惑。通過了解正在發生的事情,在寫這些事情時會大大提高你的效率。