Erro JPA - detached entity passed to persist

12 respostas
L

Olá pessoal,

Estou com um erro ao persistir uma entity.

Tenho o seguinte caso:
@Entity
public Entity1{
 private Entity2 e2;
@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_ENTITY_2", unique = false, nullable = true, insertable = true, updatable = true)
    public Entity2 getE2() {
        return e2;
    }
public void set(Entity2 e2){this.e2 = e2;}
...
}

public Entity2{
 ...
}

Quando tento persistir a entity1, segue o seguinte erro:

[color=red]15:35:54,971 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception org.hibernate.PersistentObjectException : detached entity passed to persist: teste.Entity2[/color]

A entity 1 que será persistida tem uma objeto de entity 2 com apenas o seu id.
Esse esquema já funciona em outros projetos, mas agora não funciona nesse outro.

Estive procurando no google, e parece que algumas pessoas tiveram o erro ao persistir um objeto passando o seu ID. No meu caso, entity1 não contém um id ainda. Ele eh gerado por uma identity.

Alguém já teve o mesmo problema?

Obrigada,

12 Respostas

rodrigoy

O que vc quer dizer com apenas o seu ID?

G

Boa tarde Rodrigoy!

Documentação: Thrown when the user passes a persistent instance to a Session method that expects a transient instance.

O id de Entity1 deverá ser null no momento da persistência.

Não sei de que forma está sendo feito, mas tente editar o código do método
getId com algo assim: return (id.equals(0) ? null : id);
ou configure manaulmente o id com o valor null.

L

rodrigoy:
liss:

A entity 1 que será persistida tem uma objeto de entity 2 com apenas o seu id.

O que vc quer dizer com apenas o seu ID?

Oi Rodrigo.

Eu quis dizer que a entity 2 que eu seto no entity 1 contém apenas o id, por exemplo:

Entity2 e2 = new Entity2(); e2.setId(1); //chave estrangeira Entity1 e1 = new Entity1(); e1.setE2(e2); em.persist(e1);

Em alguns momentos funciona, em outros não.
No caso dessas entities, só funcionou quando eu tire o Cascade.
Em outros casos, funciona perfeitamente.

Ah, parabéns pela palestra no Java Brasil!

[]s
LISS

R

Tbm estou passando por isso…
alguma luz?

L

raf4ever:
Tbm estou passando por isso…
alguma luz?

Olá Raf4ever,

Vou colocar abaixo a resposta que tive numa lista.

qdo vc definiu a estratégia de cascade sendo CascadeType.ALL, todo relacionamento q a sua entity tem, e a operação q vc estiver fazendo nela, ele acaba fazendo o msm para os relacionamento :wink:

http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html#ManyToOne

Ou seja, quando tirei a propriedade cascade, funcionou corretamente.

[]s
LISS

R

O problema eh q ja tirei o cascade… :cry:

A

Geraldo Eliezer:
Boa tarde Rodrigoy!

Documentação: Thrown when the user passes a persistent instance to a Session method that expects a transient instance.

O id de Entity1 deverá ser null no momento da persistência.

Não sei de que forma está sendo feito, mas tente editar o código do método
getId com algo assim: return (id.equals(0) ? null : id);
ou configure manaulmente o id com o valor null.

O que quer dizer instância transiente?

C

Geraldo Eliezer:
Boa tarde Rodrigoy!

Documentação: Thrown when the user passes a persistent instance to a Session method that expects a transient instance.

O id de Entity1 deverá ser null no momento da persistência.

Não sei de que forma está sendo feito, mas tente editar o código do método
getId com algo assim: return (id.equals(0) ? null : id);
ou configure manaulmente o id com o valor null.

Gostaria de agradecer.

Eu estava com o mesmo problema e utilizei a dica e deu certo.

Valeu!!!

robson.alecio

Recentemente tive o mesmo problema resolvi trocando a estratégia de cascata de ALL para DETACH.

T

Robson.alecio eu fiz a troca como você disse de ALL para DETACH mas assim a minha entidade não sofre as mudanças que sofreria com o ALL, o que será que devo fazer ?

robson.alecio

tiagobalduino o problema acontece porque você está tentando persistir uma entidade relacionada que não está salva ou no contexto da persistência.
Imagine um exemplo aonde temos Cidade dependendo de Estado, salve primeiro o estado e depois a Cidade.
Dependendo do framework que você está utilizando se fazer necessários pegar o objeto resultado da operação de persistência e settar esse objeto salvo no dependente.

Se isso não resolver, por gentileza post a pilha do erro.

T

Robson fiz como você disse e deu certo, retirei o cascadeType.ALL e salvei primeiro uma classe e depois a outra ficou certinho Obrigado pela ajuda parceiro, já estava com esse problema a mais de uma semana :slight_smile:

Criado 1 de novembro de 2007
Ultima resposta 25 de ago. de 2014
Respostas 12
Participantes 8