Bom dia,
Qual a forma correta de criar transações utilizando EJB e JPA??
No exemplo abaixo o método incluir esta funcionando normalmente. Porém quando tento criar uma transação para que se ocorrer uma excesão ocorre erro na linha :
manager.getTransaction().begin(); // AQUI DA O ERRO - AO PEGAR A TRANSACAO
Relacionado a este tema, também não entendo porque quando ocorre um erro de duplicidade de chave primária ele não passa pelo tratamento da Exception deste método.
Obrigado,
Jean.
jcainelli eu não sou especialista nesse assunto, mas trabalho com ele rsrs
Vou passar a forma que trabalho, se eu disser alguma besteira, fiquem os especialista a vontade para corrigir:
No seu código java vc deixou a responsabilidade de gerenciar as transações para o container,
caso precise vc mesmo gerenciar isso, teria que adicionar as a notações ± assim:
@Stateless(name = "UnidadeMedidaDAOImpl")
@TransactionManagement(TransactionManagementType.BEAN)
public class UnidadeMedidaDAOImpl implements IUnidadeMedidaDAO{
private String nomeDescritivoClasse = "Unidade de Medida";
@PersistenceContext(unitName = "residuos")
private EntityManager manager;
@Resource
UserTransaction userTransaction;
public List<Erro> incluirUnidade(UnidadeMedida unidade) throws SlmrException{
List<Erro> retorno = validatorUnidade(unidade, "");
if (retorno.size() > 0)
return retorno;
try {
userTransaction.begin(); // AQUI DA O ERRO - AO PEGAR A TRANSACAO
manager.persist(unidade);
userTransaction.commit();
} catch (Exception e) {
e.printStackTrace();
throw new SlmrException("Problemas ao incluir " + nomeDescritivoClasse +". Tente novamente!");
}
return retorno;
}
}
Mas se quiser deixar por conta do servidor basta tirar do seu código original as linhas que fazem o begin e commit, em teoria o container fará pra vc,
aqui no meu projeto eu tive um caso que precisei gerenciar pelo bean, pois precisava que fosse feito um commit a cada registro
de um while, mas pelo container ele só da commit ao final de todo o processo.
jokacwb,
Entendi agora… fiz um teste sobre isso e funcionou como vc descreveu.
Obrigado,
Jean.
jokacwb,
Testei da forma que você descreveu e funcionou… era o que precisava.
Obrigado,
Jean