Вопрос

    @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 будет откат.

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

Т1:вставить в набор myentity id=1;

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

Т2:совершить;

Т1:откат;

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

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

вставить в набор myentity id=1;

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

откат;

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

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

Это было полезно?

Решение 2

<Сильные> @solution

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top