(RESOLVIDO) URGENTE! Me ajudem (Erro: java.sql.SQLException: Field doesn't have a default value)

Estou fazendo um CRUD com mysql + Netbeans… O modelo é relacional, e estou tendo problemas com a chave estranheira… Se alguém puder me ajudar, agradeço… segue um pedaço do código …

ESSE é p erro que está dando:Erro: java.sql.SQLException: Field ‘endereco_idEndereco’ doesn’t have a default value
(OBS: as chaves primarias estao como auto incremento)

import connection.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import modelo.Cliente;
import modelo.Endereco;

/**
*

  • @author Samuelson
    */
    public class ClienteDAO {

    private Connection con = null;

    public ClienteDAO() {
    con = ConnectionFactory.getConnection();
    }

    public boolean save(Cliente cliente) {

     String sql = "INSERT INTO cliente(Cpf , Cnpj , Nome , Email ,Telefone ,Sexo) VALUES(?,?,?,?,?,?)";
    
     PreparedStatement stmt = null;
    
     try {
         stmt = con.prepareStatement(sql);
         stmt.setString(1, cliente.getCpf());
         stmt.setString(2, cliente.getCnpj());
         stmt.setString(3, cliente.getNome());
         stmt.setString(4, cliente.getEmail());
         stmt.setString(5, cliente.getTelefone());
         stmt.setString(6, cliente.getSexo());
       
      
          
            
         stmt.executeUpdate();
         return true;
     } catch (SQLException ex) {
         System.err.println("Erro: " + ex);
         return false;
     } finally {
         ConnectionFactory.closeConnection(con, stmt);
     }
    

    }

    public List findAll() {

     String sql = "SELECT * FROM cliente c inner join\n" +
    

“endereco e on c.fkEndereco= e.idEndereco;”;

    PreparedStatement stmt = null;
    ResultSet rs = null;

    List<Cliente> clientes = new ArrayList<>();

    try {

        stmt = con.prepareStatement(sql);
        rs = stmt.executeQuery();

        while (rs.next()) {

            Cliente cliente = new Cliente();

            cliente.setCnpj(rs.getString("CNPJ"));
            cliente.setCpf(rs.getString("CPF"));
            cliente.setEmail(rs.getString("Email"));
            cliente.setNome(rs.getString("Nome"));
              cliente.setSexo(rs.getString("Sexo"));
                cliente.setTelefone(rs.getString("Telefone"));
                
                Endereco endereco = new  Endereco ();

                endereco.setRua(rs.getString("Rua"));
             endereco.setNumero(rs.getString("Numero"));
            endereco.setBairro(rs.getString("Bairro"));
             endereco.setCidade(rs.getString("Cidade"));
             endereco.setUF(rs.getString("UF"));

            cliente.setEndereco_idEndereco(endereco);

            clientes.add(cliente);
        }

    } catch (SQLException ex) {
        System.err.println("Erro: " + ex);
    } finally {
        ConnectionFactory.closeConnection(con, stmt, rs);
    }

    return clientes;
}

public boolean update(Cliente cliente) {

    String sql = "UPDATE cliente SET Cpf = ?,Cnpj= ? , Nome=? , Email= ?, Telefone = ?, Sexo = ?,Endereco_idEndereco=? WHERE  idCliente = ?";

    PreparedStatement stmt = null;

    try {
        stmt = con.prepareStatement(sql);
        stmt.setString(1, cliente.getCpf());
        stmt.setString(2, cliente.getCnpj());
        stmt.setString(3, cliente.getNome());
        stmt.setString(4, cliente.getEmail());
        stmt.setString(5, cliente.getTelefone());
        stmt.setString(6, cliente.getSexo());
            stmt.setInt(7, cliente.getEndereco_idEndereco().getIdEndereco());
         stmt.setInt(8, cliente.getIdCliente());
     
        stmt.executeUpdate();
        return true;
    } catch (SQLException ex) {
        System.err.println("Erro: " + ex);
        return false;
    } finally {
        ConnectionFactory.closeConnection(con, stmt);
    }

}

}

package dao;

import connection.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import modelo.Endereco;

/**

  • CRUD

  • @author Samuelson
    */
    public class EnderecoDAO {

    private Connection con = null;

    public EnderecoDAO() {
    con = ConnectionFactory.getConnection();
    }

    public boolean save (Endereco endereco) {

     String sql = "INSERT INTO endereco(Rua,Numero,Bairro,cidade, UF) VALUES(?,?,?,?,?)";
    
     PreparedStatement stmt = null;
    
     try {
         stmt = con.prepareStatement(sql);
         stmt.setString(1, endereco.getRua());
         stmt.setString(2, endereco.getNumero());
         stmt.setString(3, endereco.getBairro());
         stmt.setString(4, endereco.getCidade());
         stmt.setString(5, endereco.getUF());
         
         
         stmt.executeUpdate();
         return true;
     } catch (SQLException ex) {
         System.err.println("Erro: " + ex);
         return false;
     } finally {
         ConnectionFactory.closeConnection(con, stmt);
     }
    

    }

    public List findAll() {

     String sql = "SELECT * FROM endereco";
    
     PreparedStatement stmt = null;
     ResultSet rs = null;
    
     List<Endereco> enderecos = new ArrayList<>();
    
     try {
    
         stmt = con.prepareStatement(sql);
         rs = stmt.executeQuery();
    
         while (rs.next()) {
             Endereco endereco = new Endereco();
             
             endereco.setRua(rs.getString("Rua"));
              endereco.setNumero(rs.getString("Numero"));
             endereco.setBairro(rs.getString("Bairro"));
              endereco.setCidade(rs.getString("Cidade"));
              endereco.setUF(rs.getString("UF"));
            
             enderecos.add(endereco);
         }
    
     } catch (SQLException ex) {
         System.err.println("Erro: " + ex);
     } finally {
         ConnectionFactory.closeConnection(con, stmt, rs);
     }
    
     return enderecos;
    

    }

    public boolean update(Endereco endereco) {

     String sql =  " UPDATE endereco SET Rua = ?,Numero = ? , Bairro = ?, Cidade = ?, UF = ? WHERE idEndereco = ?";
    
    
     PreparedStatement stmt = null;
    
     try {
         stmt = con.prepareStatement(sql);
         stmt.setString(1, endereco.getRua());
         stmt.setString(2, endereco.getNumero());
         stmt.setString(3, endereco.getBairro());
         stmt.setString(4, endereco.getCidade());
         stmt.setString(5, endereco.getUF());
         stmt.setInt(6, endereco.getIdEndereco());
         stmt.executeUpdate();
         return true;
     } catch (SQLException ex) {
         System.err.println("Erro: " + ex);
         return false;
     } finally {
         ConnectionFactory.closeConnection(con, stmt);
     }
    

    }

    public boolean delete(Endereco endereco) {

     String sql = "DELETE FROM endereco WHERE id = ?";
    
     PreparedStatement stmt = null;
    
     try {
         stmt = con.prepareStatement(sql);
            stmt.setInt(1, endereco.getIdEndereco());
         stmt.executeUpdate();
         return true;
     } catch (SQLException ex) {
         System.err.println("Erro: " + ex);
         return false;
     } finally {
         ConnectionFactory.closeConnection(con, stmt);
     }
    

    }

}

Em qual linha o erro é lançado?

O mais estranho é que nao especifica a linha… veja a foto no link:

https://drive.google.com/open?id=1FbRtcCwTDEhRNmY3J8hNJKDliOJfSSfH

Boa tarde @Mosaico!

Conforme o @matheus.cirillo falou, nos informe em qual linha de código ocorre o erro; assim ficará mais fácil te ajudar.

Porém eu tenho uma idéia do que possa ser:

  • Referente à tabela CLIENTE: se você tiver um ID_ENDERECO nesta tabela e o mesmo for FK da tabela ENDERECO e for NOT NULL, um erro ocorrerá, pois o mesmo precisa assumir um valor válido (existente na tabela ENDERECO).
  • Referente à tabela ENDERECO: talvez você esteja tentando inserir um registro, no qual deixou o campo ID_ENDERECO como AUTO_INCREMENT, mas não disse qual o valor inicial do mesmo.

Como está a modelagem do seu banco de dados?

Sim… Eis o modelo… comecei pela tabela endereço… depois a cliente que esta tendo esse problema na chave estranheira de cliente

Enviando… nao informa a linda de erro

Ei , matheus… uma imagem melhor pra vc ve oq eu disse… nao informa a linha de erro

@Mosaico, de acordo com seu modelo, “Um cliente pode (e deve) ter somente um endereço; um endereço pode estar relacionado à um ou vários clientes”.

Como o campo “endereco_idEndereco” está definido? INT, AUTO_INCREMENT, IDENTITY e NOT NULL?

Envie o script de criação das tabelas CLIENTE e ENDERECO.

1 curtida

Sim… veja:

@Mosaico, bacana.

Então veja, a tabela CLIENTE depende da tabela ENDERECO (por causa da FK);
primeiramente você deve inserir um registro na tabela ENDERECO, recuperar o ID_ENDERECO dele, e então inserir um registro na tabela CLIENTE, setando o ENDERECO_ID_ENDERECO com o valor que você acabou de recuperar.

Está fazendo tudo nesta ordem?

OBS: Percebi que seu SQL que insere um registro na tabela CLIENTE, não está referenciando a coluna ENDERECO_ID_ENDERECO, como ela é NOT NULL, isto também pode gerar um problema, pois, quando este comando for executado, se não houver um valor explícito para ela, o SGBD vai tentar enviar um VALOR_DEFAULT para ela, o que não foi definido na sua estrutura. Confere aí!

1 curtida

Olá, ao invés de tratar a exception com System.err.println("Erro: " + ex), adicione um ex.printStackTrace().
Dessa forma, conseguiremos rastrear quem nos lançou a falha.

Caramba, Nao acredito… Era esse mesmo o problema… Estou ha dias nesse problema. retiirei o NOT NULL da coluna ENDERECO_ID_ENDERECO e funcionou!!! Muito Obrigada MKlismann, vc é fera, meu!!!
Obrigada tbm ao Matheus que tentou ajudar!!!

1 curtida

Consegui resolver… Obriagada ,cara!!!

@Mosaico, é isso aí! :+1: