Erro no momento de persistir (EJB + Hibernate) - Erro: detached entity passed to persist

10 views
Skip to first unread message

Berg Oliveira

unread,
May 28, 2010, 3:34:22 PM5/28/10
to Hibernate Brasil
Olá Srs.

[b][O Erro][/b]
Estou com a seguinte Msg de Erro no momento da persistência:
[code]
EJB5018: An exception was thrown during an ejb invocation on
[DominioFacade]
javax.ejb.TransactionRolledbackLocalException: Exception thrown from
bean; nested exception is: javax.persistence.PersistenceException:
org.hibernate.PersistentObjectException: detached entity passed to
persist: beans.Cliente
[/code]

[b][Meu cenário][/b]
- Um Cliente tem vários domínios de internet
- Muitos domínios podem estar associados a um mesmo cliente.
- Um Domínio Participa de uma hospedagem.

[b][Classes][/b]

- Classe Cliente
==========================
@Entity
@SequenceGenerator(sequenceName = "cliente_sequence", name =
"cliente_sequence", initialValue = 1, allocationSize = 1)
public class Cliente implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator =
"cliente_sequence")
private int id;
@OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL)
private List<Dominio> dominios;
(...) //demais atributos e metodos
}


- Classe Domínio
==========================
@Entity
@SequenceGenerator(sequenceName = "dominio_sequence", name =
"dominio_sequence", initialValue = 1, allocationSize = 1)
public class Dominio implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator =
"dominio_sequence")
private int id;
@OneToOne(cascade = CascadeType.ALL)
private Hospedagem hospedagem;
@ManyToOne(cascade = CascadeType.ALL)
private Cliente cliente;
(...) //demais atributos e métodos
}


- A classe Hospedagem não tem nenhuma anotação para Domínio.

[b][Como estou fazendo][/b]
- Quero cadastrar uma domínio.
- Insiro os dados que lhe são próprios.
- Pesquiso n BD o Cliente e Hospedagem que serão referenciados.
- Instancio no cliente e tento persistir, como mostra abaixo:


{
//me retorna o cliente com o id 1. testei o cliente e ele retorna o
cara certo.
Cliente c = (Cliente) dao.findWithDependences(Cliente.class, 1);

//me retorna a hospedagem com o id 1. testei a hospedagem e ele
retorna o cara certo.
Hospedagem h = (Hospedagem) dao.find(Hospedagem.class, 1);

Dominio d = new Dominio();
d.setNome("Dominio 1");
d.setStatus("ativo");
d.setCliente(c);
d.setHospedagem(h);

dao.create(d);
}


Obs.: pesquisei na web e vi alguns casos em que se estava tentanto
alterar algum atributo das classes correspondentes a cliente e
hospedagem. Porém, não é esse o caso, uma vez que eu encontro os
registros, eles estão ok, e somente instancio em dominio.

Então, qq ajuda é mto bemvinda.

Valeu! Deus abençoe!!
\o/

Bruno Missi Xavier

unread,
May 31, 2010, 8:08:46 AM5/31/10
to hibernat...@googlegroups.com
Oi Berg,

Voce poderia fazer alguns testes e nos enviar o resultado?
1º - Reparei pelo nome do metodo da DAO (findWithDependences) que ele deve trazer os relacionamentos da classe. Voce poderia trazer apenas a classe sem os relacionamentos ativos? (Hospedagem  e Cliente)
Ex:
{

//me retorna o cliente com o id 1. testei o cliente e ele retorna o
cara certo.
Cliente c = (Cliente) dao.find(Cliente.class, 1);


//me retorna a hospedagem com o id 1. testei a hospedagem e ele
retorna o cara certo.
Hospedagem h = (Hospedagem) dao.find(Hospedagem.class, 1);

Dominio d = new Dominio();
d.setNome("Dominio 1");
d.setStatus("ativo");
d.setCliente(c);
d.setHospedagem(h);

dao.create(d);
}


2º - Voce poderia criar as classes Hospedagem  e Cliente com Ids fixos (Claro, de registros existentes no banco).
{

//me retorna o cliente com o id 1. testei o cliente e ele retorna o
cara certo.
Cliente c = new Cliente();
c.setId(1);

//me retorna a hospedagem com o id 1. testei a hospedagem e ele
retorna o cara certo.
Hospedagem h = new Hospedagem();
h.setId(1);


Dominio d = new Dominio();
d.setNome("Dominio 1");
d.setStatus("ativo");
d.setCliente(c);
d.setHospedagem(h);

dao.create(d);
}


Pode nos enviar o resultado destes dois testes?
Em tempo: Estou imaginando que o registro de chave primária (id) exista nas duas tabelas, como vou comentou que retorna corretamente.

Qualquer duvida estou a disposição.

--
Atenciosamente,

Bruno Missi Xavier
Consultor Interno de Gestão
Tel/cel: (28) 3521-2001 / (28) 9966-7613
www.dataci.es.gov.br
email: dataci...@cachoeiro.es.gov.br
skype: bruno.missi.xavier





2010/5/28 Berg Oliveira <file...@gmail.com>

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Hibernate Brasil" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para hibernat...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para hibernate-bras...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/hibernate-brasil?hl=pt-BR.





Reply all
Reply to author
Forward
0 new messages