Senhores,
Estou com o seguinte problema. Tenho em minha aplicação uma classe chamada Usuario. Essa classe possui auto relacionamento. Utilizo a mesma para cadastrar familias. Por exemplo, eu instancio o meu usuario com os meus atributos, depois instancio o meu pai, a minha mae, irmãos…
Usuario user = new Usuario("EU");
user.setPai(new Usuario("Meu Pai"));
user.setMae(new Usuario("Minha Mãe"));
Até ae tudo bem.
Eu tenho listas de usuarios também, pois um usuario pode ter vários irmaos e vários filhos.
Quando eu acesso o meu JSP o usuario aparece com todos os dados preenchidos normalmente (Pai, mae, todos os irmaos, todos os filhos…)
Mas quando clico em um dos Irmaos desse usuario principal, por exemplo, os dados desse irmão é carregado na tela, mas as listas não sao.
Acho que tem algo a ver com o Lazy e o Eager, mas não sei como resolver. Estou mandando a minha classe Usuario.
Obrigado!
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
@Table(name="tbl_usuario")
public class Usuario {
/*
* Construtores
*/
public Usuario(String nome, boolean stVivo, String sexo, int nivel, Familia familia){
this.nomeCompleto = nome;
this.stVivo = stVivo;
this.sexo = sexo;
this.nivel = nivel;
this.familia = familia;
}
public Usuario(){
}
/*
* Atributos de instância
*/
@Id
@SequenceGenerator(name = "SEQ", sequenceName = "seq_usuario", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ")
@Column(name="id_usuario")
private Long id;
@Column(name="cpf")
private String cpf;
@Column(name="nome")
private String nomeCompleto;
@Column(name="st_vivo")
private boolean stVivo;
@Column(name="sexo")
private String sexo;
@Column(name="data_nascimento")
@Temporal(TemporalType.DATE)
private Date dataNascimento;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="id_pai", referencedColumnName="id_usuario", updatable=true, insertable=true)
private Usuario pai;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="id_mae", referencedColumnName="id_usuario", updatable=true, insertable=true)
private Usuario mae;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="id_endereco")
private Endereco endereco;
@Column(name="nivel")
private Integer nivel;
@ManyToMany
@JoinTable(name="tbl_conjuge", joinColumns=@JoinColumn(name="id_usuario", referencedColumnName="id_usuario"),
inverseJoinColumns=@JoinColumn(name="id_conjuge", referencedColumnName="id_usuario"))
private List<Usuario> listaDeConjuge;
@ManyToMany
@JoinTable(name="tbl_filhos", joinColumns=@JoinColumn(name="id_usuario", referencedColumnName="id_usuario"),
inverseJoinColumns=@JoinColumn(name="id_filho", referencedColumnName="id_usuario"))
private List<Usuario> listaDeFilhos;
@ManyToMany
@JoinTable(name="tbl_irmaos", joinColumns=@JoinColumn(name="id_usuario", referencedColumnName="id_usuario"),
inverseJoinColumns=@JoinColumn(name="id_irmao", referencedColumnName="id_usuario"))
private List<Usuario> listaDeIrmaos;
@ManyToMany
(fetch=FetchType.LAZY)
@JoinTable(name="tbl_usuario_questionario", joinColumns=@JoinColumn(name="id_usuario"), inverseJoinColumns=@JoinColumn(name="id_questionario"))
private List<Questionario> listaDeQuestionarios;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="id_familia", referencedColumnName="id_familia", updatable=true, insertable=true)
private Familia familia;
@ManyToMany
(fetch=FetchType.LAZY)
@JoinTable(name="tbl_usuario_enfermidade", joinColumns=@JoinColumn(name="id_usuario"), inverseJoinColumns=@JoinColumn(name="id_enfermidade"))
private List<Enfermidade> listaDeEnfermidades;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="id_entrevista")
private Entrevista entrevista;
/*
* Getters and Setters
*/
public Entrevista getEntrevista() {
return entrevista;
}
public void setEntrevista(Entrevista entrevista) {
this.entrevista = entrevista;
}
public List<Enfermidade> getListaDeEnfermidades() {
return listaDeEnfermidades;
}
public void setListaDeEnfermidades(List<Enfermidade> listaDeEnfermidades) {
this.listaDeEnfermidades = listaDeEnfermidades;
}
public Familia getFamilia() {
return familia;
}
public void setFamilia(Familia familia) {
this.familia = familia;
}
public List<Questionario> getListaDeQuestionarios() {
return listaDeQuestionarios;
}
public void setListaDeQuestionarios(List<Questionario> listaDeQuestionarios) {
this.listaDeQuestionarios = listaDeQuestionarios;
}
public List<Usuario> getListaDeConjuge() {
return listaDeConjuge;
}
public void setListaDeConjuge(List<Usuario> listaDeConjuge) {
this.listaDeConjuge = listaDeConjuge;
}
public List<Usuario> getListaDeFilhos() {
return listaDeFilhos;
}
public void setListaDeFilhos(List<Usuario> listaDeFilhos) {
this.listaDeFilhos = listaDeFilhos;
}
public List<Usuario> getListaDeIrmaos() {
return listaDeIrmaos;
}
public void setListaDeIrmaos(List<Usuario> listaDeIrmaos) {
this.listaDeIrmaos = listaDeIrmaos;
}
public Integer getNivel() {
return nivel;
}
public void setNivel(Integer nivel) {
this.nivel = nivel;
}
public Endereco getEndereco() {
return endereco;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getNomeCompleto() {
return nomeCompleto;
}
public void setNomeCompleto(String nomeCompleto) {
this.nomeCompleto = nomeCompleto;
}
public boolean isStVivo() {
return stVivo;
}
public void setStVivo(boolean stVivo) {
this.stVivo = stVivo;
}
public String getSexo() {
return sexo;
}
public void setSexo(String sexo) {
this.sexo = sexo;
}
public Date getDataNascimento() {
return dataNascimento;
}
public void setDataNascimento(Date dataNascimento) {
this.dataNascimento = dataNascimento;
}
public Usuario getPai() {
return pai;
}
public void setPai(Usuario pai) {
this.pai = pai;
}
public Usuario getMae() {
return mae;
}
public void setMae(Usuario mae) {
this.mae = mae;
}
/*
*
* equals and hashCode.
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Usuario other = (Usuario) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}