EJB CMT TransactionAttributeType.REQUIRES_NEW não funciona
-
29-09-2020 - |
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!
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.