Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Controle de transação

private void finalizaFormulario() {
        preencheAluno();
        if (aluno.temIdValido()) {
            alunoDAO.edita(aluno);
        } else {
            int alunoId = alunoDAO.salva(aluno).intValue();
            String numeroFixo = campoTelefoneFixo.getText().toString();
            Telefone telefoneFixo = new Telefone(numeroFixo, TipoTelefone.FIXO, alunoId);
            String numeroCelular = campoTelefoneCelular.getText().toString();
            Telefone telefoneCelular = new Telefone(numeroCelular, TipoTelefone.CELULAR, alunoId);
            telefoneDAO.salvar(telefoneFixo, telefoneCelular);

        }
        finish();
    }

Como fica o controle de transação? Quero que somente salve o aluno se salvar o telefone também.

2 respostas
solução!

Oi Emerson, tudo bem?

Para isso, você pode considerar o uso de uma transação (Transaction). Caso aconteça alguma exception durante a execução nenhuma das entidades são salvas, segue um exemplo de implementação:

@Dao
public abstract class AlunoTelefoneDAO {

    @Insert
    abstract Long salva(Aluno aluno);

    @Insert
    abstract Long salva(Telefone telefone);

    @Transaction
    public void salva(Aluno aluno, Telefone telefone){
        Long id = salva(aluno);
        telefone.setAlunoId(id.intValue());
        salva(telefone);
        throw new RuntimeException();
    }

}

Testando essa amostra, faço a simulação de salvar um aluno e telefone na mesma transação e lanço uma exception, ao ocorrer a exception as entidades não são salvas, caso contrário funciona normalmente.

Note que para salvar ambas entidades criei outro DAO, pois agora ele tá lidando com mais de uma entidade.

[]s

Muito obrigado!!!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software