Erro de projeto? violation of PRIMARY or UNIQUE KEY constraint "PK_PRODUTO"

11 respostas
D

Ola
Criei inicialmente um projeto java desktop no netbeans ,criei as classes de modelo dao e view estava funcionando perfeitamente com o tempo resolvi criar um novo projeto maven e transferir as classes do projeto inicial para o novo e foi ai que meu problema começou.
Toda vez que tento inserir um registro no banco de dados firebird o comando
PreparedStatement.execute me retorna um erro Exception occurred in target VM: GDS Exception. 335544665. violation of PRIMARY or UNIQUE KEY constraint "PK_PRODUTO" on table "PRODUTO" Problematic key value is ("ID" = 457101).

Estou parando a execução do projeto e verificando se o registro já existe e mesmo dessa forma da erro. Engraçado e que no projeto antigo esta tudo normal executa numa boa

public boolean Inserir (Connection c , Produto pro ){
    
    try {
        PreparedStatement pst = c.prepareStatement("insert into PRODUTO (  ID, TIPO, FK_PRODUTO_SUBGRUPO, FK_PRODUTO_UNIDADE, DESCRICAO, STATUS, OBSERVACAO, ESTOQUE_MAXIMO, ITENS_CAIXA, FK_CLASSIFICACAO_FISCAL, DATA_CADASTRO, FK_PRODUTO_MARCA, SUBSTITUICAO_TRIB_RETIDO, REFERENCIA, DESCONTO_MAXIMO, PESO_BRUTO, PESO_LIQUIDO, CUSTO, FK_LISTA_SERVICO_ITEM, FK_PRODUTO_COR, FK_PRODUTO_TAMANHO, CUSTO_MEDIO, CUSTO_DOLAR, FK_PRODUTO_UNIDADE_2, CUBAGEM, CUSTO_ULTIMO, PERCENTUAL_VENDA_SERVICO, PORCAO_POR_PESSOA, TEMPO_PREPARO, QUANTIDADE, GUARNICOES, FK_PRODUTO_ESPECIFICACAO, ISS_PERCENTUAL, CODIGO_PESO, UTILIZA_BALANCA_PESO, ARREDONDAMENTO_TRUNCAMENTO, PRODUCAO_PROPRIA_TERCEIROS, SITE_UTILIZA, FK_CLASSIFICACAO_SEM_SIMILAR, FK_CLASSIFICACAO_IPI, EMBALAGEM_QUANT_ITENS , VALIDADE_DIAS , VALIDADE_TIPO, VALOR_NUTRICIONAL , FK_PRODUTO_COLECAO, TIPO_REFEICAO ) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? )");
        pst.setInt(1,pro.getId());
        pst.setShort(2,pro.getTipo());
        if (pro.getFk_produto_subgrupo()== 0 ) {
            pst.setNull(3,java.sql.Types.INTEGER);                
       
        } else {
            pst.setInt(3,pro.getFk_produto_subgrupo());
        
        }
        pst.setInt(4,pro.getFk_produto_unidade());
        pst.setString(5, pro.getDescricao());
        pst.setInt(6,pro.getStatus());
        pst.setString(7, pro.getObservacao());
        pst.setBigDecimal(8, pro.getEstoqueMaximo());
        pst.setBigDecimal(9, pro.getItensCaixa());
        pst.setInt(10,pro.getFk_classificacao_fiscal());
        pst.setDate(11, new java.sql.Date(pro.getDataCadastro().getTime()));
        if (pro.getFk_produto_marca()== 0) {
            pst.setNull(12,java.sql.Types.INTEGER);
        } else {
            pst.setInt(12,pro.getFk_produto_marca());
        }
        pst.setString(13, pro.getSubstituicaoTribRetido().toString());
        pst.setString(14, pro.getReferencia());
        pst.setBigDecimal(15, pro.getDescontoMaximo());
        pst.setBigDecimal(16, pro.getPesoBruto());
        pst.setBigDecimal(17, pro.getPesoLiquido());
        pst.setBigDecimal(18, pro.getCusto());
        if (pro.getFk_lista_serviço_item()==0) {
            pst.setNull(19, java.sql.Types.INTEGER);
        } else {
            pst.setInt(19,pro.getFk_lista_serviço_item());
        }
        
        if(pro.getFk_produto_cor() == 0 ){
            pst.setNull(20, java.sql.Types.INTEGER);
        } else {
            pst.setInt(20,pro.getFk_produto_cor());
        }
        if (pro.getFk_produto_tamanho()==0) {
            pst.setNull(21,java.sql.Types.INTEGER);
            
        } else {
            pst.setInt(21,pro.getFk_produto_tamanho());
        }
     
        pst.setBigDecimal(22, pro.getCustoMedio());
        pst.setBigDecimal(23, pro.getCustoDolar());
        if (pro.getFk_produto_unidade_2() == 0) {
            pst.setNull(24,java.sql.Types.INTEGER);               
        } else {
            pst.setInt(24,pro.getFk_produto_unidade_2());
        }
        pst.setBigDecimal(25, pro.getCubagem());
        pst.setBigDecimal(26, pro.getCustoUltimo());
        pst.setBigDecimal(27, pro.getPercentualVendaServico());
        pst.setInt(28,pro.getPorcaoPorPessoa());
        if (pro.getTempoPreparo() == null) {
            pst.setNull(29 , java.sql.Types.DATE);
        } else {
            pst.setDate(29, new java.sql.Date(pro.getTempoPreparo().getTime()));
        }
        pst.setBigDecimal(30, pro.getQuantidade());
        pst.setInt(31,pro.getGuarnicoes());
        if (pro.getFk_produto_Especificacao()==0) {
            pst.setNull(32,java.sql.Types.INTEGER);
        } else {
            pst.setInt(32,pro.getFk_produto_Especificacao());
        }
               
        pst.setBigDecimal(33, pro.getIssPercentual());
        if (pro.getCodigoPeso()==0) {
            pst.setNull(34,java.sql.Types.INTEGER );                
        } else {
            pst.setInt(34, pro.getCodigoPeso());
        }
        pst.setString(35,pro.getUtilizaBalancaPeso().toString());
        pst.setShort(36,pro.getArredondamentoTruncamento());
        pst.setShort(37,pro.getProducaoPropriaTerceiros());
        pst.setString(38,pro.getSiteUtiliza().toString());
        if (pro.getFk_classificacao_sem_similar()== 0) {
            pst.setNull(39,java.sql.Types.INTEGER);
        } else {
            pst.setInt(39,pro.getFk_classificacao_sem_similar());
        }
        if (pro.getFk_classificacao_ipi()==0) {
            pst.setNull(40,java.sql.Types.INTEGER);
        } else {
            pst.setInt(40,pro.getFk_classificacao_ipi());
        }
        pst.setBigDecimal(41, pro.getEmbalagemQuantItens());
        pst.setShort(42,pro.getValidadeDias());
        pst.setInt(43,pro.getValidadeTipo());
        pst.setBigDecimal(44, pro.getValorNutricional());
        if (pro.getFk_produto_colecao()==0) {
            pst.setNull(45,java.sql.Types.INTEGER);
        } else {
            pst.setInt(45,pro.getFk_produto_colecao());
        }
        pst.setShort(46, pro.getTipoRefeicao());
        
        pst.execute();
        
        return true;
       
    } catch (Exception e) {

        return false;
    }



}

11 Respostas

A

Tem certeza que você não modificou alguma outra coisa do projeto e não se deu conta? Essa mensagem não parece ter relação com o maven.

P

Pois é, tudo indica que você inseriu duas vezes o mesmo produto na tabela, com ID já existente.

D

Desculpa a demora em Responder
Vou adicionar o código da classe o único método que uso e PreparedStatement.execute e mesmo com a base limpa ele continua retornando esse erro. acho que talvez o problema seja nas dependências que o maven baixa para o aplicativo

D

Desculpa a demora em Responder
Usei a função de comparação de código do próprio netbeans ate fiz umas modificações mas foi na classes de view nada que use o banco de dados

A

Bem, o erro é de violação de constraint, ou seja, é relacionado com o banco de dados, provavelmente deve ser na coluna ID. Que lógica você usa na geração do ID? O problema é que está sendo gerado um ID que já existe no banco, daí ocorre a violação da chave primária. Mas o que é estranho é esse fato do erro ocorrer apenas quando você usa o Maven.

D

Segue as dependências que estou usando não sei se os drivers do firebird são corretos

mysql mysql-connector-java 5.1.37 org.firebirdsql.jdbc jaybird-jdk18 2.2.7 org.hibernate hibernate-core 5.0.4.Final org.hibernate hibernate-entitymanager 5.0.4.Final org.hibernate hibernate-jpamodelgen 5.0.4.Final javax.transaction jta 1.1
P

Se está ocorrendo mesmo com a base limpa, o código deve estar inserindo duas vezes o mesmo id dentro da mesma execução. Debuga passo a passo e veja

D

Já debuguei ate o método PreparedStatement.execute para dentro dele nunca fui mas ate ali nada vou verificar dentro dele

P

nao verifique dentro nao
verifique quantas vezes ele ta chamando execute desse prepared statement. ou colocque um log toda vez que esse dao/classe for chamada.

D

Para gerar o id eu criei esse método que usa um gerador de id do banco

public Integer Index (Connection c) {
        
    try {
        Statement st = c.createStatement();
        ResultSet rs = st.executeQuery("select GEN_ID(GEN_PRODUTO,1) from RDB$DATABASE");
        rs.next();
        String s = rs.getString(1);
        s = s.concat("01");
        Integer i = Integer.parseInt(s);            
        return i ;
    
    } catch (Exception e) {
    
    return null;
        
    }

}
D

Desculpa a ignorância mas como faço isso ???

Criado 15 de dezembro de 2015
Ultima resposta 18 de dez. de 2015
Respostas 11
Participantes 3