No livro Enterprise Java Beans 3.0, da Oreilly, tem uma frase que tem sido enigmática pra mim: “TransactionRequiredException é lançada se esse método for invocado em um contexto de persistência com escopo de transação”. O método a que ele se refere é o persist. Na verdade alguns outros como o merge têm esse mesmo comportamento.
O problema é que eu não estou conseguindo simular o disparo dessa exceção. Pelo que entendi, o exemplo abaixo deveria disparar, supondo que o cliente chame o método setCabin:
@Stateful
public class TransactionPersistenceContextBean implements TransactionPersistenceContextRemote
{
@PersistenceContext(unitName="titan")
private EntityManager manager;
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void setCabin(int pk)
{
Cabin cabin = manager.find(Cabin.class, pk);
cabin.setBedCount(2);
manager.merge(cabin);
}
...
}
Tentei forçar a barra fazendo
Mas o código continuou executando sem problemas. Alguém pode me indicar como exatamente funciona essa exceção ?
Então, essa anotação diz ao container que o método deve estar em um contexto de transação simplesmente, e que se algo der errado os conceitos aplicados a esse tipo de contexto deve ser acionados, exemplo é que você pode efeutar alguma modificação ao seu banco de dados e caso no final ocorra algum erro e feito um roll-back, simplesmente isso.
abs
TransactionRequiredException so é lançado pelos metodos persist, merge, remove, refresh se for executado em um bean CMT sem contexto de transacao.
Essa exception tambem é lancada em metodos que utilizam o TransactionAttribute = MANDATORY e sao chamados em um contexto sem transacao.
rlazoti, então o correto seria “fora de um contexto de persistência com escopo de transação” ? E outra, o livro diz que é válido chamar o merge se for num contexto de persistência extendido… Tô com um nó na cabeça
Tem como você postar um exemplo que dispara essa exceção? Do jeito que tá no livro tá meio genérico, não precisaria do TransactionAttribute = MANDATORY. Para quem tem o livro em português tá na página 52, na seção “Persistindo Entidades”. Tô com uma forte suspeita de um erro de tradução…
Galera, saquei o lance do TransactionRequiredException. Quando o cliente chama um método anotado com @Transactional, pode acontecer do método anular a transação aberta pelo cliente e/ou não abrir nenhuma transação. Isso depende do tipo de transação informado.
Vejam a figura abaixo:
Se, por exemplo, method-B estiver marcado como MANDATORY (conforme informado anteriormente) e A não estiver dentro de uma transação, B não tentará criar uma e a exceção será disparada.
Desculpem o tamanho da figura, não sei como diminuir…