Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: java.sql.SQLException: Field 'ID' doesn't have a default value

Al correr el programa me aparece el error Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: java.sql.SQLException: Field 'ID' doesn't have a default value

ProductoController `package com.alura.jdbc.controller;

import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;

import com.alura.jdbc.factory.ConnectionFactory;

public class ProductoController {

public void modificar(String nombre, String descripcion, Integer id) {
    // TODO
}

public void eliminar(Integer id) {
    // TODO
}

public List<Map<String, String>> listar() throws SQLException {

    ConnectionFactory factory = new ConnectionFactory();
    Connection con = factory.recuperaConexion();

    Statement statement = con.createStatement();

    statement.execute("SELECT ID, NOMBRE, DESCRIPCION, CANTIDAD FROM PRODUCTO");

    ResultSet resultSet = statement.getResultSet();

    List<Map<String, String>> resultado = new ArrayList<>();

    while (resultSet.next()) {
        Map<String,String> fila = new HashMap<>();
        fila.put("ID", String.valueOf(resultSet.getInt("ID")));
        fila.put("NOMBRE", resultSet.getString("NOMBRE"));
        fila.put("DESCRIPCION", resultSet.getString("DESCRIPCION"));
        fila.put("CANTIDAD", String.valueOf(resultSet.getInt("CANTIDAD")));

        resultado.add(fila);
    }
    con.close();
    return resultado;
}

public void guardar(Map<String, String> producto) throws SQLException {
    ConnectionFactory factory = new ConnectionFactory();
    Connection con = factory.recuperaConexion();

    Statement statement = con.createStatement();

    statement.execute("INSERT INTO PRODUCTO (nombre, descripcion, cantidad) "
            + " VALUES('" + producto.get("NOMBRE") + "', '"
            + producto.get("DESCRIPCION") + "', '"
            + producto.get("CANTIDAD") + "')", Statement.RETURN_GENERATED_KEYS);

    ResultSet resultSet = statement.getGeneratedKeys();

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

}


**ControlDeStockFrame**

    private void eliminar() {
        if (tieneFilaElegida()) {
            JOptionPane.showMessageDialog(this, "Por favor, elije un item");
            return;
        }

        Optional.ofNullable(modelo.getValueAt(tabla.getSelectedRow(), tabla.getSelectedColumn()))
                .ifPresentOrElse(fila -> {
                    Integer id = (Integer) modelo.getValueAt(tabla.getSelectedRow(), 0);

                    this.productoController.eliminar(id);

                    modelo.removeRow(tabla.getSelectedRow());

                    JOptionPane.showMessageDialog(this, "Item eliminado con éxito!");
                }, () -> JOptionPane.showMessageDialog(this, "Por favor, elije un item"));
    }

    private void cargarTabla() {
        try {
            var productos = this.productoController.listar();
             try {

                productos.forEach(producto -> modelo.addRow(new Object[] { producto.get("ID"), producto.get("NOMBRE"),
                producto.get("DESCRIPCION"), producto.get("CANTIDAD") }));
                } catch (Exception e) {
                    throw e;
                }

        } catch(SQLException e) {
            throw new RuntimeException(e);
        }

    }

    private void guardar() {
        if (textoNombre.getText().isBlank() || textoDescripcion.getText().isBlank()) {
            JOptionPane.showMessageDialog(this, "Los campos Nombre y Descripción son requeridos.");
            return;
        }

        Integer cantidadInt;

        try {
            cantidadInt = Integer.parseInt(textoCantidad.getText());
        } catch (NumberFormatException e) {
            JOptionPane.showMessageDialog(this, String
                    .format("El campo cantidad debe ser numérico dentro del rango %d y %d.", 0, Integer.MAX_VALUE));
            return;
        }

        // TODO
        var producto = new HashMap<String, String>();
        producto.put("NOMBRE", textoNombre.getText());
        producto.put("DESCRIPCION", textoDescripcion.getText());
        producto.put("CANTIDAD", String.valueOf(cantidadInt));

        var categoria = comboCategoria.getSelectedItem();

        try {
            this.productoController.guardar(producto);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        JOptionPane.showMessageDialog(this, "Registrado con éxito!");

        this.limpiarFormulario();
    }

    private void limpiarFormulario() {
        this.textoNombre.setText("");
        this.textoDescripcion.setText("");
        this.textoCantidad.setText("");
        this.comboCategoria.setSelectedIndex(0);
    }

}
2 respuestas
solución!

Hola Mauro, diria que el problema esta en que cuando creaste la tabla producto, no declaraste al id como auto incrementable, si recuerdas en el capitulo Introduccion a JDBC en la actividad Entorno y versiones cuando el instrucctor crea la tabla usa el comando "id INT AUTO_INCREMENT".

Si no hiciste eso la base de datos te va a pedir siempre un valor para ID.

Una forma de comprobarlo es entrar al workbench o usando la consola de comandos para ingresar un nuevo dato pero sin especificar un valor para ID y te deberia dar error.

Si este es tu error una forma de cambiarlo es usando el comando de ALTER TABLE así:

 ALTER TABLE producto CHANGE id id INT AUTO_INCREMENT;

Espero esto resuelva tu problema

Estas en lo correcto, gracias!