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:
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));
}
}
}
}
}
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 ✓.