2010-07-26 53 views
1
@Stateless @LocalBean 
    public class MySLSB { 

      @Resource 
      SessionContext ctx; 
      @PersistenceContext(unitName = "myPU") 
      EntityManager em; 

      public void T1() { 
       em.persist(new MyEntity(1L)); //T1 created! 
/* wrong call to plain java object    
T2(); 
*/  
//corrected by lookup its business object first 
ctx.getBusinessObject(MySLSB.class).T2(); 
    ctx.setRollbackOnly(); 
      } 

      @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
      public void T2() { 
       em.persist(new MyEntity(2L)); //T2 created! 
      } 
     } 

客戶端調用T1(),在第一T2作爲一種新的交易應該被提交, 但T1將被回滾。EJB CMT TransactionAttributeType.REQUIRES_NEW不起作用

預期結果:

T1:插入myEntity所組ID = 1; T2:insert into myentity set id = 2;

T2:commit;

T1:回滾;

- >在數據庫中創建id = 2的行。

實際結果:

insert into myentity set id = 1;

insert into myentity set id = 2;

rollback;

- >在數據庫中沒有創建任何內容。

什麼問題?非常感謝!

回答

1

@Solution

的問題就解決了。我犯了一個天真的錯誤。對T2()的調用應該查找它的業務對象,直接調用T2()IS僅僅是它的普通Java對象。

我更新了上述問題的代碼,使所有工作都像預期的那樣工作。

2

聲明自我參照@EJB MySLSB me;並致電me.T2();而不是使用ctx.getBusinessObject(MySLSB.class)可能會更容易。但感覺是一樣的。