EJB CMT TransactionAttributeType.REQUIRES_NEW не работает - PullRequest
1 голос
/ 26 июля 2010
    @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 будет откат.

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

T1: вставить в myentity set id = 1;

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

T2: коммит;

T1: откат;

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

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

вставить в myentity set id = 1;

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

Откат;

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

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

Ответы [ 2 ]

2 голосов
/ 14 октября 2010

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

1 голос
/ 26 июля 2010

@ Решение

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

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

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

...