2012-01-16 132 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类中声明 - 该注释在类本身而不是方法或字段上。

又见这些问题的答案对于一些有识之士为事务管理是如何工作的: