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

Java, JDBC, DAO, e connection.setAutoCommit(false);

public class ProdutoDAO {

    private Connection connection;

    public ProdutoDAO(Connection connection) {
        this.connection = connection;
    }

    public void salvar(Produto produto){
        String sql = "INSERT INTO PRODUTO (nome, descricao) VALUES (?, ?)";
        try(PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
            preparedStatement.setString(1, produto.getNome());
            preparedStatement.setString(2, produto.getDescricao());
            preparedStatement.execute();

            try(ResultSet resultSet = preparedStatement.getGeneratedKeys()){
                while (resultSet.next()){
                    produto.setId(resultSet.getInt(1));
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

a minha duvida aqui é o seguinte, onde colocar o setAutoCommit(false) para ter o controle. poderia colocar no metodo construtor, e assim eu teria que dar commit no final de todos os metodos? poderia me passar uma solução boa

2 respostas

Olá Luccas! Tudo bem?

Você está certo em pensar que o setAutoCommit(false) é importante para ter controle sobre as transações no seu código. Colocar no construtor pode ser uma opção, mas isso implicaria que todos os métodos da sua classe ProdutoDAO precisariam gerenciar o commit e o rollback manualmente, o que pode não ser ideal em termos de clareza e manutenção do código.

Uma abordagem comum é gerenciar as transações no nível do serviço, onde você chama os métodos do DAO. Vou te mostrar um exemplo de como você pode fazer isso:

  1. No DAO, não gerencie o commit/rollback:

    public class ProdutoDAO {
    
        private Connection connection;
    
        public ProdutoDAO(Connection connection) {
            this.connection = connection;
        }
    
        public void salvar(Produto produto) throws SQLException {
            String sql = "INSERT INTO PRODUTO (nome, descricao) VALUES (?, ?)";
            try (PreparedStatement preparedStatement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
                preparedStatement.setString(1, produto.getNome());
                preparedStatement.setString(2, produto.getDescricao());
                preparedStatement.execute();
    
                try (ResultSet resultSet = preparedStatement.getGeneratedKeys()) {
                    while (resultSet.next()) {
                        produto.setId(resultSet.getInt(1));
                    }
                }
            }
        }
    }
    
  2. Gerencie as transações no nível do serviço:

    public class ProdutoService {
    
        private ProdutoDAO produtoDAO;
        private Connection connection;
    
        public ProdutoService(Connection connection) {
            this.connection = connection;
            this.produtoDAO = new ProdutoDAO(connection);
        }
    
        public void salvarProduto(Produto produto) {
            try {
                connection.setAutoCommit(false);
    
                produtoDAO.salvar(produto);
    
                connection.commit();
            } catch (Exception e) {
                try {
                    connection.rollback();
                } catch (SQLException rollbackEx) {
                    rollbackEx.printStackTrace();
                }
                e.printStackTrace();
            } finally {
                try {
                    connection.setAutoCommit(true);
                } catch (SQLException autoCommitEx) {
                    autoCommitEx.printStackTrace();
                }
            }
        }
    }
    

Dessa forma, você mantém a responsabilidade de gerenciar transações fora do DAO, tornando o código mais modular e fácil de manter. O serviço (ProdutoService) controla quando iniciar e finalizar uma transação, enquanto o DAO apenas executa as operações de banco de dados.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.
solução!

Perfeito Professor, consegui compreender melhor agora, muito obrigado!