2010-07-26 1 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 не работает

Ожидаемый результат:

Т1: вставить в MyEntity Set ID = 1;

T2: вставить в набор myentity id = 2;

T2: commit;

T1: откат;

-> Строка с id = 2 создана в БД.

Фактический результат:

вставки в MyEntity Set ID = 1;

Вставить в myentity set id = 2;

откатный;

-> Ничего не создано в БД.

В чем проблема? Большое спасибо!

ответ

1

@Solution

Задача решена. я сделал наивную ошибку.

Вызов T2() должен искать свой бизнес-объект, прямой вызов T2() - это просто его простой Java-объект.

Я обновил код по вопросу выше, заставив все работать так, как ожидалось.

2

Возможно, было бы проще объявить самоопределение @EJB MySLSB me; и позвонить по телефону me.T2(); вместо ctx.getBusinessObject(MySLSB.class). Но смысл тот же.