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);
}
}