[Resolvido]Erro MySQLIntegrityConstraintViolationException

Prezados,

Estou desenvolvendo uma aplicaçao java Web, que contem duas tabelas (fornecedor,produto).
Estou conseguindo cadastrar na tabela fornecedor numa boa, agora quando tento gravar na tabela produto gera o erro abaixo:

EXCESSÃO: MySQLIntegrityConstraintViolationException

MENSAGEM: Cannot add or update a child row: a foreign key constraint fails (estoque/produto, CONSTRAINT produto_ibfk_1 FOREIGN KEY (idFornecedor) REFERENCES fornecedor (id))

Estruturas das tabelas criadas:


CREATE TABLE fornecedor(
      id int(10) unsigned NOT NULL AUTO_INCREMENT,
      nome varchar(50) NOT NULL,
      cnpj long  NOT NULL,
      email varchar(50) NOT NULL,
      telefone varchar(20) NOT NULL,
      PRIMARY KEY (id));

CREATE TABLE produto (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  nome varchar(50) NOT NULL,
  marca varchar(50) NOT NULL,
  quantidadetotal int(10) unsigned DEFAULT NULL,
  preco float NOT NULL,
  idFornecedor int(10) unsigned NOT NULL,
  PRIMARY KEY (id),
  KEY fk_produto_fornecedor (idFornecedor),
  CONSTRAINT fk_produto_fornecedor FOREIGN KEY (idFornecedor) REFERENCES fornecedor (id));

Segue o metodo inserir das classes DAO:


public class FornecedorDAO {

private Connection con;

	public FornecedorDAO() throws SQLException {
		this.con = ConnectionFactory.getConnection();
	}
	
	public int incluir(	FornecedorBean fornecedor) throws SQLException {
		if (fornecedor == null) return 0;
		PreparedStatement stmt = con.prepareStatement("INSERT INTO Fornecedor (nome, cnpj, email, telefone) values (?, ?, ?, ?)");
		stmt.setString(1, fornecedor.getNome());
		stmt.setLong(2, fornecedor.getCnpj());
		stmt.setString(3, fornecedor.getEmail());
		stmt.setString(4, fornecedor.getTelefone());
		int retorno = stmt.executeUpdate();
		stmt.close();
		return retorno;
	}		


public class ProdutoDAO {
	private Connection con;
	
	public ProdutoDAO() throws SQLException {
		this.con = ConnectionFactory.getConnection();
	}
	
	public int incluir(ProdutoBean produto) throws SQLException {
		if (produto == null) return 0;
		PreparedStatement stmt = con.prepareStatement("INSERT INTO Produto (nome, marca, quantidadetotal, preco, idFornecedor) values (?, ?, ?, ?, ?)");
		stmt.setString(1, produto.getNome());
		stmt.setString(2, produto.getMarca());
		stmt.setInt(3, produto.getQuantidadetotal());
		stmt.setFloat(4, produto.getPreco());
		stmt.setLong(5, produto.getFornecedor().getId());
		int retorno = stmt.executeUpdate();
		stmt.close();
		return retorno;
	}	

Me ajudem, ja procurei na net ajuda mais nao encontrei nada.

Atta

Seu problema é pq a sua coluna idFornecedor está como NotNull

idFornecedor int(10) unsigned NOT NULL

Coloque como Null apenas e prometo que você será ainda mais feliz! [=

jakefrog valeu por responder, fiz a alteraçao como voce sugiriu mais o erro continuou.

So uma observaçao, se eu criar a tabela dessa forma abaixo, a aplicaçao deixa eu cadastrar porem na listagem de produto aparece apenas o campo do fornecedor mas em branco

CREATE TABLE produto (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  nome varchar(50) NOT NULL,
  marca varchar(50) NOT NULL,
  quantidadetotal int(10) unsigned DEFAULT NULL,
  preco float NOT NULL,
  idFornecedor int(10) unsigned NOT NULL,
  PRIMARY KEY (id),
  KEY fk_produto_fornecedor (idFornecedor),
  CONSTRAINT fk_produto_fornecedor FOREIGN KEY (id) REFERENCES fornecedor (id));

Bem, a msg exibida é pq vc está tentando inserir um projeto sem o fornecedor. Por isso que ele está tando essa mensagem de erro.

por isso disse para você retirar o not null.

Não sei se o MySQL aceita uma FK como null. Se não aceitar, tu vai ter mudar teu insert.

O segundo código que você postou continua com o idFornecedor int(10) unsigned NOT NULL,

C tem certeza que tu retirastes o notnull e testou?

vc está utilizando JPA nas classes?

Engraçado que tenho outro projeto, que a tebela foi criada da mesma forma e nao da nenhum erro.

Sim eu tirei o NOT como voce surgiriu e o erro continuou.

Nao estou utilizando JPA.

Terai como vc me passar seu e-mail, ai te mando o meu projeto todo e o script de BD

O problema é que estás a inserir um produto com um id de fornecedor que não existe. Cria primeiro o fornecedor.

A aplicaçao ja faz essa verificaçao, quando tento inserir um produto e que nao tenha nenhum fornecedor cadastrado o sistema fala que é preciusa eu cadastrar um fornecedor antes, ai vou la e cadastrado um fornecedor, na tela de cadastrar produto tem uma lista onde ja pega os forncedores cadastrados, ai quando clico em grava acontece o erro.

E já validaste que o valor que estás a colocar na PreparedStatement é o id ?

Olá gust,

Criei a sua estrutura aqui em minha maquina e, tanto o insert na tabela fornecedor quanto na produto funcionou.

Não funcionou quando tentei adicionar um produto com idfornecedor null, como já apresentado pelos colegas ai. Tente rodar o script direto no banco, se funcionar, o problema esta em sua aplicação.

Espero ter lhe sido útil, abraços.

_ _
Fabiano Abreu
Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL

Eu ja fiz esse teste, ja fiz o insert para tabela produto direto no BD e nao deu erro, ai fui na aplicaçao consegui visualizar o produto, ai tento alterar pela aplicar e volta a dar o msm erro.

Cara se eu te mar o war do meu projeto tem como vc dar uma olhada?pois ja revisei e nao consegui achar o erro, as vezes uma outra pessoa olhando consegue achar.

Abraço

gust, mas você esta tendo inserir ou alterar o registro?

_ _
Fabiano Abreu
Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL

Estou tentando inserir. mas se eu fazer o insert manualmente direto no BD da certo, ai vou na aplicaçao e tento alterar o registro q fiz manualmente e a aplicaçao da o msm erro de quando tento inserir.

gust, não manjo nada de programação, minha área é banco de dados, logo, não saberia te auxiliar.

Mas tenta debugar seu código, veja o que a aplicação esta ‘encaminhando’ para o banco de dados, com isto talvez poderá identificar a falha.

Abraços.

_ _
Fabiano Abreu
Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL

Isso já eu tentei dizer lá atrás…

Pessoal consegui resolver o erro.

O problema estava na aplicaçao, segue:

Classe

if (request.getParameter("Id") != null) (produto.getFornecedor()).setId(Long.valueOf(request.getParameter("Id")));

Formulario de entrada produto:

[code]

Fornecedor


<c:forEach var=“fornecedor” items="${fornecedores}">
<c:if test="${produto.fornecedor.id == fornecedor.id}">
${fornecedor.nome}
</c:if>
<c:if test="${produto.fornecedor.id != fornecedor.id}">
${fornecedor.nome}
</c:if>
</c:forEach>
[/code]

Dai o erro, eu esta setando a variavel como “id” na clasee e no formulario a varaivel tava como “fornecedorId”

Ai so alterei a classe para setar como “forncedorId” e resolveu,o problema era que nao estava achando o id para cadastrar na tabela produto.

valeu