3
respuestas

[Bug] Problema para insertar nuevos productos

Luego de implementar la tabla de categorias y sus configuraciones para listar, estoy teniendo problemas para guardar nuevos productos. Al insertar un nuevo producto me aparece que ha sido guardado con exito pero no se guarda realmente en la base de datos. Este es mi código para guardar productos:

public void guardar(Producto producto) {
        try (con) {
            final PreparedStatement statement = con.prepareStatement(
                    "INSERT INTO PRODUCTO(nombre, descripcion, cantidad) " + "VALUES(?, ?, ?);",
                    Statement.RETURN_GENERATED_KEYS);

            try (statement) {
                ejecutaRegistro(producto, statement);
            }
        } catch (SQLException e) {
            throw new RuntimeException();
        }
    }
    
    private void ejecutaRegistro(Producto producto, PreparedStatement statement) throws SQLException {
        statement.setString(1, producto.getNombre());
        statement.setString(2, producto.getDescripcion());
        statement.setInt(3, producto.getCantidad());
        statement.execute();

        final ResultSet resultSet = statement.getGeneratedKeys();

        try (resultSet) {

            while (resultSet.next()) {
                producto.setId(resultSet.getInt(1));
                System.out.println(String.format("Fue insertado el producto %s", producto));
            }
        }
    }
3 respuestas

Hola Maria,

Aunque tu código parece correcto en términos de cómo se intenta insertar el producto, puede haber un problema con la forma en que se maneja la transacción de la base de datos o algun conflito con el método statement.execute, por ejemplo.

En tu código, estás ejecutando la consulta SQL para insertar el producto, pero no veo ninguna llamada a commit() para confirmar la transacción. En muchos sistemas de gestión de bases de datos, si no confirmas una transacción, los cambios no se guardan permanentemente en la base de datos.

Podrías intentar agregar una llamada a commit() después de statement.execute(), así:

public void guardar(Producto producto) {
        try (con) {
            final PreparedStatement statement = con.prepareStatement(
                    "INSERT INTO PRODUCTO(nombre, descripcion, cantidad) " + "VALUES(?, ?, ?);",
                    Statement.RETURN_GENERATED_KEYS);

            try (statement) {
                ejecutaRegistro(producto, statement);
            }
            con.commit();  // Agrega esta línea
        } catch (SQLException e) {
            try {
                con.rollback();  // También es una buena práctica manejar las excepciones y hacer rollback si algo sale mal
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            throw new RuntimeException();
        }
    }

Por favor, intenta hacer este cambio y ve si resuelve tu problema. Recuerda que debes configurar tu conexión para que no sea auto-commit. Esto se puede hacer con con.setAutoCommit(false); antes de empezar a ejecutar tus consultas.

Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.

¡Vamos juntos!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios.

Creo que esto te puede servir → https://app.aluracursos.com/forum/topico-duda-error-you-can-t-operate-on-a-closed-connection-220456

Tuve el mismo error y la solución de Adriana Silva me funcionó.