2012-01-16 2 views
0

다음 코드는 update() 메소드에서 널 포인터 예외를 throw하더라도 롤백에 도움이되지 않습니다. 매번 코드를 실행하면 데이터베이스에 값이 삽입됩니다. update() 메소드에서 null 포인터가 발생하면 어떻게 트랜잭션을 롤백 할 수 있습니까? 코드에서 뭔가 빠졌습니까?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를 사용하지 않는? 또한 EJB의 트랜잭션 전파, 롤백 등에 대한 자세한 내용은 온라인 설명서 (http://docs.oracle.com/javaee/6/tutorial/doc/)를 참조하십시오. –

답변

0

몇 가지가 나를 의심스럽게 내뱉습니다.

  • Bean 클래스 없음 @Stateless, @Stateful 또는 @Singleton 주석. ejb-jar.xml 파일에서 bean을 선언하지 않았다면 EJB로 인식되지 않습니다. 확실히 두 번 확인해.

  • DbConn.getConnection()은 (는) 데이터베이스 연결을 직접 관리하려고하는 것처럼 보입니다. DriverManager을 사용하는 코드 또는 new FooDataSource()을 사용하는 코드가있는 경우 이것이 분명히 문제입니다. 당신이 원하는 경우 트랜잭션 관리는 EJB 클래스

  • JNDI 룩업 yourDataSource는 데이터 소스의 이름입니다 java:comp/env/yourDataSource,의에 @Resource DataSource datasource 필드를 통해 하나

    • 주입을 통해 컨테이너에서 모든 리소스를 얻을 필요가 작동하는 방법 ejb-jar.xml에서 구성되었거나 @Resource(type=DataSource.class, name="youDataSource")을 사용하여 bean 클래스에서 선언되었습니다. 주석은 메소드 또는 필드가 아닌 클래스 자체에 있습니다.

는 트랜잭션 관리가 어떻게 작동하는지에 관한 일부 통찰력이 답변을 참조하십시오 :

관련 문제