Pergunta

    @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!
            }
        }

O cliente chama T1 (), no primeiro T2 como uma nova transação, deve ser cometida, mas o T1 será revertido.

Resultado esperado:

T1:insira no conjunto de entidades id = 1;

T2:insira no conjunto de entidades id = 2;

T2:comprometer-se;

T1:reversão;

-> A linha com id=2 é criada no DB.

Resultado atual:

insira no conjunto de entidades id = 1;

insira no conjunto de entidades id = 2;

reversão;

-> Nada é criado no banco de dados.

Qual é o problema?Muito obrigado!

Foi útil?

Solução 2

@Solução

O problema está resolvido.cometi um erro ingênuo.

A chamada para T2() deve procurar seu objeto de negócios, a chamada direta para T2() IS meramente para seu objeto Java simples.

atualizei o código da pergunta acima, fazendo com que tudo funcionasse conforme o esperado.

Outras dicas

Pode ser mais fácil declarar auto-referência @EJB MySLSB me; e para ligar me.T2(); ao invés de usar ctx.getBusinessObject(MySLSB.class).Mas o sentido é o mesmo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top