Persistindo relacionamentos com o Hibernate

3 respostas
vinny767

Fala pessoal,

Estou com a seguinte dúvida: tenho uma situação no meu sistema onde preciso cadastrar vários usuários em uma tabela com auto-relacionamento. Por exemplo… Tenho uma tabela chamada Usuarios. Nesta tabela, eu cadastro um usuario, o seu pai, a sua mae, seus irmaos, tios, etc…
Um usuario tem o ID de seu pai, o ID de sua mae que também sao usuarios.
Acho que isso eh o de menos… Meu problema está na persistencia.

Vamos pensar na seguinte situacao: Eu criei três instancias de usuario (o proprio usuario, a mae e o pai).

Usuario usuario = new Usuario();
  Usuario pai       = new Usuario();
  Usuario mae     = new Usuario();

Depois, tentei setar o pai e a mae em Usuario

usuario.setPai(pai);
  usuario.setMae(mae);

Quando mando gravar, logicamente, dá erro. Provavelmente pq pai e mae ainda nao estão persistidos no banco (ainda nao foram gerados os id’s).
Entao tenho que gravar primeiro o pai, depois a mae, depois setar os objetos no usuarioe gravar o usuario.

Gostaria de saber se existe alguma forma de setar o objeto inteiro, com todas as suas dependencias, para depois mandar grava-lo. Se conseguir, COMMIT, senao, ROLLBACK. Tem como?

Obrigado!

3 Respostas

arthurminarini

vc dividiu as classes em herança? ex: classe pai extends usuario vc fez isso?

arthurminarini

se vc fez qual o seu Mapping inheritance e sua strategy

vinny767

Não utilizei herança não. Na verdade, é tudo usuario. Tem os mesmos atributos, os mesmos métodos… Não teria o que herdar, por exemplo.
Vou mandar o codigo da minha classe usuario.

package br.gov.progenesdomain.domain.entity;

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;
	}
	
}
Criado 20 de fevereiro de 2009
Ultima resposta 20 de fev. de 2009
Respostas 3
Participantes 2