Duvida com auto relacionamentos e beans de entidade

2 respostas
C

tudo bom pessoal
tenho um bean de entidade Colaborador, e este, possiu outro Colaborador pai dentro dele, formando assim um auto relacionamento
esse auto relacionamento serve pra eu saber qual eh o pai da colaborador selecionado
fiz este exemplo soh pra testar a arvore do richfaces soh q durante o meu CRUD percebi algo estranho

por exemplo
quando eu edito e salvo o Colaborador 11, passando o Colaborador 4 como o pai, as vezes o Hibernate parece q troca os objetos e salva diferente
ele salva o Colaborador 11 com o pai 11 (isso eh… ele mesmo)… e ainda por cima vai no 4 e salva ele mesmo como pai (pai 4 tb)
meu bean de entidade estah correto?
oq pode estar acontecendo?

package br.com.facul.cadastro.model;

import java.io.Serializable;
import java.util.ArrayList;
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.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import br.com.facul.cadastro.config.SystemConstants;

@Entity
@Table(name = "COLABORADOR", schema = SystemConstants.DATABASE_SCHEMA)
public class Colaborador implements Serializable {

	private static final long serialVersionUID = 1L;

	private Long id;
	private Colaborador colaboradorParent;
	private EstadoCivil estadoCivil;
	private Escolaridade escolaridade;
	private String codigo;
	private String nome;
	private String rg;
	private String cpf;
	private Date dataNascimento;
	private String sexo;
	private String nomePai;
	private String nomeMae;
	private Date dataHoraEntradaSistema;
	private List<Colaborador> subordinados = new ArrayList<Colaborador>();
	private List<ColaboradorEmail> emails = new ArrayList<ColaboradorEmail>();
	private List<ColaboradorTelefone> telefones = new ArrayList<ColaboradorTelefone>();
	private List<ColaboradorEndereco> enderecos = new ArrayList<ColaboradorEndereco>();

	public Colaborador() {
	}

	public Colaborador(Colaborador aColaboradorParent, EstadoCivil aEstadoCivil, Escolaridade aEscolaridade, 
			String aCodigo, String aNome, String aRg, String aCpf, 
			Date aDataNascimento, String aSexo, String aNomePai, String aNomeMae, 
			Date aDataHoraEntradaSistema, List<Colaborador> aSubordinados, List<ColaboradorEmail> aEmails, List<ColaboradorTelefone> aTelefones, 
			List<ColaboradorEndereco> aEnderecos) {
		colaboradorParent = aColaboradorParent;
		estadoCivil = aEstadoCivil;
		escolaridade = aEscolaridade;
		codigo = aCodigo;
		nome = aNome;
		rg = aRg;
		cpf = aCpf;
		dataNascimento = aDataNascimento;
		sexo = aSexo;
		nomePai = aNomePai;
		nomeMae = aNomeMae;
		dataHoraEntradaSistema = aDataHoraEntradaSistema;
		subordinados = aSubordinados;
		emails = aEmails;
		telefones = aTelefones;
		enderecos = aEnderecos;
	}

	@Id
	@GeneratedValue
	@Column(name = "ID")
	public Long getId() {
		return id;
	}

	public void setId(Long aId) {
		id = aId;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_COLABORADOR_PARENT")
	public Colaborador getColaboradorParent() {
		return colaboradorParent;
	}

	public void setColaboradorParent(Colaborador aColaboradorParent) {
		colaboradorParent = aColaboradorParent;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_ESTADO_CIVIL")
	public EstadoCivil getEstadoCivil() {
		return estadoCivil;
	}

	public void setEstadoCivil(EstadoCivil aEstadoCivil) {
		estadoCivil = aEstadoCivil;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_ESCOLARIDADE")
	public Escolaridade getEscolaridade() {
		return escolaridade;
	}

	public void setEscolaridade(Escolaridade aEscolaridade) {
		escolaridade = aEscolaridade;
	}

	@Column(name = "CODIGO", length = 10)
	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String aCodigo) {
		codigo = aCodigo;
	}

	@Column(name = "NOME", length = 50)
	public String getNome() {
		return nome;
	}

	public void setNome(String aNome) {
		nome = aNome;
	}

	@Column(name = "RG", length = 20)
	public String getRg() {
		return rg;
	}

	public void setRg(String aRg) {
		rg = aRg;
	}

	@Column(name = "CPF", length = 11)
	public String getCpf() {
		return cpf;
	}

	public void setCpf(String aCpf) {
		cpf = aCpf;
	}

	@Column(name = "DATA_NASCIMENTO")
	public Date getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Date aDataNascimento) {
		dataNascimento = aDataNascimento;
	}

	@Column(name = "SEXO", length = 1)
	public String getSexo() {
		return sexo;
	}

	public void setSexo(String aSexo) {
		sexo = aSexo;
	}

	@Column(name = "NOME_PAI", length = 80)
	public String getNomePai() {
		return nomePai;
	}

	public void setNomePai(String aNomePai) {
		nomePai = aNomePai;
	}

	@Column(name = "NOME_MAE", length = 80)
	public String getNomeMae() {
		return nomeMae;
	}

	public void setNomeMae(String aNomeMae) {
		nomeMae = aNomeMae;
	}

	@Column(name = "DATA_HORA_ENTRADA_SISTEMA")
	public Date getDataHoraEntradaSistema() {
		return dataHoraEntradaSistema;
	}

	public void setDataHoraEntradaSistema(Date aDataHoraEntradaSistema) {
		dataHoraEntradaSistema = aDataHoraEntradaSistema;
	}

	@OneToMany(mappedBy = "colaboradorParent", fetch = FetchType.LAZY)
	public List<Colaborador> getSubordinados() {
		return subordinados;
	}

	public void setSubordinados(List<Colaborador> aSubordinados) {
		subordinados = aSubordinados;
	}

	@OneToMany(mappedBy = "colaborador", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
	public List<ColaboradorEmail> getEmails() {
		return emails;
	}

	public void setEmails(List<ColaboradorEmail> aEmails) {
		emails = aEmails;
	}

	@OneToMany(mappedBy = "colaborador", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
	public List<ColaboradorTelefone> getTelefones() {
		return telefones;
	}

	public void setTelefones(List<ColaboradorTelefone> aTelefones) {
		telefones = aTelefones;
	}

	@OneToMany(mappedBy = "colaborador", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
	public List<ColaboradorEndereco> getEnderecos() {
		return enderecos;
	}

	public void setEnderecos(List<ColaboradorEndereco> aEnderecos) {
		enderecos = aEnderecos;
	}

	@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;
		Colaborador other = (Colaborador) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}

2 Respostas

Lavieri

Apesar de achar horrivel esses…

estadoCivil = aEstadoCivil; … colocar esse a na frente do nome propriedade não acho 1 boa, melhor deixar o mesmo nome, e usar um this pra referencia da classe.

fora isso aparece estar tudo normal…

mostra o código em q vc ta fazendo os sets dos parents e verificando que ele ta setando ele mesmo…

C

e ai lavieri
mais uma vez me ajudando… vlw demais

ainda nao consegui resolver o problema mas tem outro q estah me incomodando mais ainda no auto-relacionamento
imagine 3 outputtext com esses values

value="#{colaborador.colaboradorParent.nome}" // nao funciona
	value="#{colaborador.estadoCivil.descricao}" // funciona ok
	value="#{colaborador.escolaridade.descricao}" // funciona ok

no find eu faco os seguintes fetchs

criteria.setFetchMode("colaboradorParent", FetchMode.JOIN);
	criteria.setFetchMode("estadoCivil", FetchMode.JOIN);
	criteria.setFetchMode("escolaridade", FetchMode.JOIN);

Desconsidere os fetchs de estado civil e escolaridade

se eu retirar value="#{colaborador.colaboradorParent.nome}" do meu JSPX ele funciona
se eu colocar ele dah um Lazy Initialization Exception (to nesse inferno ateh hoje :smiley: )
engracado q todos sao manytoone e fazem o mesmo fetch… mas soh nos valores do colaboradorParent q dah pau
existem cuidados especificos qd se usa auto relacionamento?

vlw

Criado 31 de março de 2009
Ultima resposta 6 de abr. de 2009
Respostas 2
Participantes 2