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();
}
}
ñ está Incrementando chave primaria
5 Respostas
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.
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.
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 xxxxxxxseu 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 xxxxxxxporé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 xxxxxxxquando inserir um novo registro...
A query vai retorna 6 e sua solução vai tentar inserir novamente o item com ID = 7Linha - 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.
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 xxxxxxxseu 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 xxxxxxxporé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 xxxxxxxquando inserir um novo registro...
A query vai retorna 6 e sua solução vai tentar inserir novamente o item com ID = 7Linha - 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.