Qual a forma correta de criar transações utilizando EJB e JPA?

3 respostas
J

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.

3 Respostas

jokacwb

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.

J

jokacwb,

Entendi agora… fiz um teste sobre isso e funcionou como vc descreveu.

Obrigado,

Jean.

J

jokacwb,

Testei da forma que você descreveu e funcionou… era o que precisava.

Obrigado,

Jean

Criado 8 de junho de 2011
Ultima resposta 9 de jun. de 2011
Respostas 3
Participantes 2