2012-01-16 131 views
0

即使我在update()方法拋出空指針異常,以下代碼也無助於回滾。每次運行代碼時,它都會將值插入數據庫中。請幫助我如何在update()方法拋出空指針時回滾事務。我在代碼中丟失了什麼嗎?CMT回滾:如何回滾事務

@TransactionManagement(value = TransactionManagementType.CONTAINER) 
public class Bean implements RemoteIF { 

    @TransactionAttribute(TransactionAttributeType.REQUIRED) 
    public void insertIntoDb() { 

     insert(); 
     update(); 


    } 


    private Integer update() { 
val=0;  
try { 
      Connection con = DbConn.getConnection(); 
      Statement st = con.createStatement(); 
      val1 = st.executeUpdate("INSERT INTO tab VALUES('ab')"); 
      st.close(); 
      throw new NullPointerException(); 

     } catch (Exception e) { 
      System.out.println(e); 
     } 

     return val; 
    } 

    private Integer insert() { 
     int val = 0; 

     try { 

      Connection con = DbConn.getConnection(); 
      Statement st = con.createStatement(); 
      val = st.executeUpdate("INSERT INTO tab VALUES('bnm')"); 
      st.close(); 

     } catch (Exception e) { 
      System.out.println(e); 
     } 

     return val; 
    } 
} 
+0

你爲什麼不使用JPA?另請參閱在線教程http://docs.oracle.com/javaee/6/tutorial/doc/以瞭解有關EJB中的事務傳播,回滾等的更多信息 – 2012-01-16 15:24:57

回答

0

夫婦的事情,作爲犯罪嫌疑人堅持在我身上。

  • Bean類沒有@Stateless@Stateful@Singleton註解。除非你在ejb-jar.xml文件中聲明瞭該bean,否則這不會被識別爲EJB。絕對重複檢查一下。

  • DbConn.getConnection()看起來很像你可能試圖自己管理數據庫連接。如果您有任何使用DriverManagernew FooDataSource()的代碼,那肯定是問題所在。如果你想事務管理工作,你必須通過一個@Resource DataSource datasource場通過兩種

    • 注射得到容器中的所有資源,在EJB類
    • JNDI查找java:comp/env/yourDataSource,其中yourDataSource是數據源的名稱你配置在ejb-jar.xml中或通過使用@Resource(type=DataSource.class, name="youDataSource")在bean類中聲明 - 該註釋在類本身而不是方法或字段上。

又見這些問題的答案對於一些有識之士爲事務管理是如何工作的: