Desculpa a demora, mas é que minha conexão esta uma carroça…
Bem, vamos lá então aos códigos e detalhamento do erro:
Eu usei a facilidade do Hibernate de criar um banco de dados via código java e no modelo de dados entre outros objetos eu tenho um Usuario e um Imóvel…
(Detalhe: Estou utilizando o VRaptor como framework)
Cada Imóvel tem um bag de “Telefone”
Cada Usuario tem um bag de “Telefone” e um de “Email”
Ao criar o banco, o Hibernate mapeou assim:
“telefone” | “telefone_imovel” | “telefone_usuario”
“email” | "email_usuario
Para inserir meu Usuário eu chamo primeiro um metodo addTelefone e o mesmo pra email onde guardo dinamicamente cada entidade dessas, seja telefone ou email…
Quando aciono o botão de inserir ele coloca essas entidades em uma lista e adiciona essas listas para a entidade Usuario.
Então fica assim:
Usuario (Lista de Telefones | Lista de Emails)
Usando o cascade, gravo perfeitamente no BD todos esses dados nas respectivas tabelas. (A princípio duvidei se daria certo, pois tinha duas tabelas não mapeadas no relacionamento “usuario_telefone” e “usuario_email” que continha os código para fins de relacionamentos, mas paguei minha língua… :P).
Para excluir também funciona belezinha…
Mas na hora de editar…
Ele traz todos os dados corretos na página, só que quando modifico algo e mando alterar ele me traz esse erro:
org.hibernate.HibernateException: Found shared references to a collection: br.com.softsun.imobiliaria.modelo.Usuario.email
Minhas classes para que vcs possam entender melhor os problemas:
Usuario:
package br.com.softsun.imobiliaria.modelo;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import org.hibernate.annotations.Cascade;
@Entity
public class Usuario {
@Id
@GeneratedValue
private Long id;
private String login;
private String senha;
private String nome;
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="cd_tipo_usuario")
private TipoUsuario tipoUsuario;
private String cep;
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="cd_pais")
private Pais pais;
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="cd_estado")
private Estado estado;
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="cd_cidade")
private Cidade cidade;
@ManyToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="cd_bairro")
private Bairro bairro;
private String endereco;
private String complementoEndereco;
@OneToMany( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private List<Email> email;
@OneToMany( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private List<Telefone> telefone;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getSenha() {
return senha;
}
public void setSenha(String senha) {
this.senha = senha;
}
public String getCep() {
return cep;
}
public void setCep(String cep) {
this.cep = cep;
}
public Bairro getBairro() {
return bairro;
}
public void setBairro(Bairro bairro) {
this.bairro = bairro;
}
public Cidade getCidade() {
return cidade;
}
public void setCidade(Cidade cidade) {
this.cidade = cidade;
}
public Estado getEstado() {
return estado;
}
public void setEstado(Estado estado) {
this.estado = estado;
}
public Pais getPais() {
return pais;
}
public void setPais(Pais pais) {
this.pais = pais;
}
public TipoUsuario getTipoUsuario() {
return tipoUsuario;
}
public void setTipoUsuario(TipoUsuario tipoUsuario) {
this.tipoUsuario = tipoUsuario;
}
public String getComplementoEndereco() {
return complementoEndereco;
}
public void setComplementoEndereco(String complementoEndereco) {
this.complementoEndereco = complementoEndereco;
}
public List<Email> getEmail() {
return email;
}
public void setEmail(List<Email> email) {
this.email = email;
}
public String getEndereco() {
return endereco;
}
public void setEndereco(String endereco) {
this.endereco = endereco;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public List<Telefone> getTelefone() {
return telefone;
}
public void setTelefone(List<Telefone> telefones) {
this.telefone = telefones;
}
}
Telefone:
package br.com.softsun.imobiliaria.modelo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Telefone {
public static final int USUARIO = 1;
public static final int IMOVEL = 2;
@Id
@GeneratedValue
private Long id;
private String descricao;
private int codigoArea;
private int codigoEntidade;
public int getCodigoArea() {
return codigoArea;
}
public void setCodigoArea(int codigoArea) {
this.codigoArea = codigoArea;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public int getCodigoEntidade() {
return codigoEntidade;
}
public void setCodigoEntidade(int codigoEntidade) {
this.codigoEntidade = codigoEntidade;
}
}
Email:
package br.com.softsun.imobiliaria.modelo;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Email {
@Id
@GeneratedValue
private Long id;
private String descricao;
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
Caso não seja suficiente para entender, eu coloco outras partes…
Desde já sou grato pelo auxílio!