Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Bug] guarda dos veces la descripcion ocupando nombre cuando guardo algun producto no se que pueda ser dejo el codigo por si algo

public void guardar(Map<String,String> producto) throws SQLException { var nombre = producto.get("nombre"); var descripcion = producto.get("descripcion"); var cantidad = Integer.valueOf(producto.get("cantidad")); final var cantidadMaxima = 100;

        ConnectionFactory factory = new ConnectionFactory();

        final Connection con = factory.recuperaConexion();

        try(con) {
            con.setAutoCommit(false);
            final PreparedStatement statement = con.prepareStatement(
                    "INSERT INTO producto "
                            + "(nombre, descripcion, cantidad)"
                            + " VALUES(?,?,?)",
                    Statement.RETURN_GENERATED_KEYS);
            try(statement) {
                do {
                    int cantidadParaGuardar = Math.min(cantidad, cantidadMaxima);

                    ejecutaRegistro(nombre, descripcion, cantidadParaGuardar, statement);

                    cantidad -= cantidadMaxima;
                } while (cantidad > 0);
                con.commit();
                System.out.println("Commit exitoso");
            }catch(Exception e) {
                e.printStackTrace();
                con.rollback();
                System.out.println("Roll back de la transsaccion");
            }
        }
    }

private void ejecutaRegistro(String nombre, String descripcion, Integer cantidad, PreparedStatement statement)
        throws SQLException {
    statement.setString(1, nombre);
    statement.setString(2, descripcion);
    statement.setInt(3, cantidad);

    if (cantidad < 50) {
        throw new RuntimeException("Ocurrió un error");
    }

    statement.execute();

    final ResultSet resultSet = statement.getGeneratedKeys();

    try(resultSet) {
        while (resultSet.next()) {
            System.out.println(String.format("Fue insertado el producto de ID: %d", resultSet.getInt(1)));
        }
    }
}
1 respuesta

¡Hola Gabriel!

Al revisar el código que compartiste, parece que el problema se encuentra en el método "ejecutaRegistro". En este método se están guardando los datos del producto en la base de datos, pero antes de hacerlo, se está lanzando una excepción si la cantidad es menor a 50. Esto significa que si la cantidad es menor a 50, no se guardará el producto en la base de datos, pero sí se imprimirá el mensaje "Fue insertado el producto de ID: %d". Esto puede estar causando que la descripción se guarde dos veces, ya que se está ejecutando el método "ejecutaRegistro" varias veces en el método "guardar".

Te sugiero que revises la lógica de tu código y elimines la excepción que se lanza en el método "ejecutaRegistro" si la cantidad es menor a 50. En su lugar, puedes agregar una validación en el método "guardar" para asegurarte de que la cantidad sea mayor o igual a 50 antes de llamar al método "ejecutaRegistro".

Espero que esta respuesta te haya sido útil. ¡Buenos estudios!