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.