ñ está Incrementando chave primaria


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

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!

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.

[code]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();  
    }  
}  [/code]

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.

[quote=Rafael_Leal][code]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();  
    }  
}  [/code]

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.[/quote]

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.

[quote=brunojf][quote=Rafael_Leal][code]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();  
    }  
}  [/code]

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.[/quote]

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.[/quote]

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.