2010-07-26 90 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)可能会更容易。但感觉是一样的。