ñ está Incrementando chave primaria

5 respostas
Y
Exception Description: Cannot persist detached object [modelo.LPessoa[cdPessoa=3]]. Class> modelo.LPessoa Primary Key> [3]  


//metodo cadastrar pessoa
public String create() {
        EntityManager em = getEntityManager();
        try {
            em.getTransaction().begin();
            LPessoa.setCdPessoa(this.getSeq());
            em.persist(LPessoa);
            em.getTransaction().commit();
            addSuccessMessage("Pessoa cadastrado com sucesso");
        } catch (Exception ex) {
            try {
                addErrorMessage(ex.getLocalizedMessage());
                em.getTransaction().rollback();
            } catch (Exception e) {
                addErrorMessage(e.getLocalizedMessage());
            }
        } finally {
            em.close();
        }
        return "LPessoa_list";
    }


public int getSeq() {
        int count=0;
        EntityManager em = getEntityManager();
        try{
            {//System.out.println(" ENTROU..");
                
                count =  (Integer)em.createQuery("select max(o.cdUsuarios) from LUsuarios as o").getSingleResult();
                count ++;
            }
            return count;
        } finally {
            em.close();
        }
    }

5 Respostas

thiago.correa

Como está o mapeamento da tua entidade?!
Ele não consegue salvar pois quando ele vê que o atributo mapeado como ID não está nulo, o JPA entende que você está tentando atualizar um registro!

brunojf

Cria uma classe genérica só pro atributo ID e manda sua entidade herdar dela .
E faz o mapeamento pra ela incrementar o id sozinha.
Assim qualquer classe já vai ta pronta para o insert.

R
public int getSeq() {  
        int count=0;  
        EntityManager em = getEntityManager();  
        try{  
            {//System.out.println(" ENTROU..");  
                  
                count =  (Integer)em.createQuery("select max(o.cdUsuarios) from LUsuarios as o").getSingleResult();  
                count ++;  
            }  
            return count;  
        } finally {  
            em.close();  
        }  
    }

Se você excluir 1 elemento da tabela LUsuarios.... o resultado da query não será mais igual a id do ultimo registro causando erro na sua lógica.
Ex:

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
4.      4    xxxxxxx
5.      5    xxxxxxx
6.      6    xxxxxxx

seu select retorna = 6 e salva 7. 7 xxxxxxxxx

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
4.      4    xxxxxxx
5.      5    xxxxxxx
6.      6    xxxxxxx
7.      7    xxxxxxx

porém se excluirmos a linha 4...

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
5.      5    xxxxxxx
6.      6    xxxxxxx
7.      7    xxxxxxx

quando inserir um novo registro...
A query vai retorna 6 e sua solução vai tentar inserir novamente o item com ID = 7

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
4.      5    xxxxxxx
5.      6    xxxxxxx
6.      7    xxxxxxx
7.      7    xxxxxxx (PK - duplicada)

O Hibernate por lançar uma exceção ou proprio banco.

Se a PK é sequencial... tente mapear a PK como sequence no banco e no hibernate.
Pois par o EntityManager... se a Entidade tiver o ID nulo ele salvará um novo registro e caso contrário ele vai tentar fazer update. São coisas diferente para conexão com o banco.

brunojf
Rafael_Leal:
public int getSeq() {  
        int count=0;  
        EntityManager em = getEntityManager();  
        try{  
            {//System.out.println(" ENTROU..");  
                  
                count =  (Integer)em.createQuery("select max(o.cdUsuarios) from LUsuarios as o").getSingleResult();  
                count ++;  
            }  
            return count;  
        } finally {  
            em.close();  
        }  
    }

Se você excluir 1 elemento da tabela LUsuarios.... o resultado da query não será mais igual a id do ultimo registro causando erro na sua lógica.
Ex:

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
4.      4    xxxxxxx
5.      5    xxxxxxx
6.      6    xxxxxxx

seu select retorna = 6 e salva 7. 7 xxxxxxxxx

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
4.      4    xxxxxxx
5.      5    xxxxxxx
6.      6    xxxxxxx
7.      7    xxxxxxx

porém se excluirmos a linha 4...

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
5.      5    xxxxxxx
6.      6    xxxxxxx
7.      7    xxxxxxx

quando inserir um novo registro...
A query vai retorna 6 e sua solução vai tentar inserir novamente o item com ID = 7

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
4.      5    xxxxxxx
5.      6    xxxxxxx
6.      7    xxxxxxx
7.      7    xxxxxxx (PK - duplicada)

O Hibernate por lançar uma exceção ou proprio banco.

Se a PK é sequencial... tente mapear a PK como sequence no banco e no hibernate.
Pois par o EntityManager... se a Entidade tiver o ID nulo ele salvará um novo registro e caso contrário ele vai tentar fazer update. São coisas diferente para conexão com o banco.

não intendi de onde você tirou essa chave duplicada o.O
Ele ta pegando o maior valor de "o.cdUsuarios" e não quantidade de linhas ,se ele apagar o registro da linha 4 o "o.cdUsuarios" ainda vai ser 7 e próximo vai ser 8 de qualquer jeito.

R
brunojf:
Rafael_Leal:
public int getSeq() {  
        int count=0;  
        EntityManager em = getEntityManager();  
        try{  
            {//System.out.println(" ENTROU..");  
                  
                count =  (Integer)em.createQuery("select max(o.cdUsuarios) from LUsuarios as o").getSingleResult();  
                count ++;  
            }  
            return count;  
        } finally {  
            em.close();  
        }  
    }

Se você excluir 1 elemento da tabela LUsuarios.... o resultado da query não será mais igual a id do ultimo registro causando erro na sua lógica.
Ex:

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
4.      4    xxxxxxx
5.      5    xxxxxxx
6.      6    xxxxxxx

seu select retorna = 6 e salva 7. 7 xxxxxxxxx

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
4.      4    xxxxxxx
5.      5    xxxxxxx
6.      6    xxxxxxx
7.      7    xxxxxxx

porém se excluirmos a linha 4...

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
5.      5    xxxxxxx
6.      6    xxxxxxx
7.      7    xxxxxxx

quando inserir um novo registro...
A query vai retorna 6 e sua solução vai tentar inserir novamente o item com ID = 7

Linha - ID - outrasColunas
1.      1    xxxxxxx
2.      2    xxxxxxx
3.      3    xxxxxxx
4.      5    xxxxxxx
5.      6    xxxxxxx
6.      7    xxxxxxx
7.      7    xxxxxxx (PK - duplicada)

O Hibernate por lançar uma exceção ou proprio banco.

Se a PK é sequencial... tente mapear a PK como sequence no banco e no hibernate.
Pois par o EntityManager... se a Entidade tiver o ID nulo ele salvará um novo registro e caso contrário ele vai tentar fazer update. São coisas diferente para conexão com o banco.

não intendi de onde você tirou essa chave duplicada o.O
Ele ta pegando o maior valor de "o.cdUsuarios" e não quantidade de linhas ,se ele apagar o registro da linha 4 o "o.cdUsuarios" ainda vai ser 7 e próximo vai ser 8 de qualquer jeito.

VERDADE...

Eu li COUNT no lugar de MAX... falha minha.

Mas deixe pro Hibernate e o Banco tratar da sequence da PK.
Pois não você não consegue salvar um novo registro com Hibernate se a o campo sequencial estiver mapeado no Banco e não no Hibernate ou o inverso.

Criado 25 de junho de 2012
Ultima resposta 25 de jun. de 2012
Respostas 5
Participantes 4