Problemas com relacionamento ManyToOne no Hibernate [ENCERRADO]

5 respostas
rfgallon

E ai pessoal blz?
Seguinte, estou com um problema no relacionamento ManyToOne do Hibernate, já procurei e fiz vários testes mas não consegui resolver.
Tenhos a Classe Unidade relacionada com Colegiado. Uma unidade por ter vários colegiados.
Na minha classe colegiado esta assim

@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name="idunidade", insertable=false, updatable=false)
	@Fetch(FetchMode.JOIN)
	@Cascade(CascadeType.SAVE_UPDATE)
	private Unidade unidade;

Porém, acontece o seguinte problema, ele insere o registro nas duas tabelas, se mudo o CascadeType para REMOVE por exemplo, ele grava somente no colegiado (até ai beleza), porém na coluna do código da unidade ele grava NULL

Alguém sabe aonde estou errando?

5 Respostas

rgf

Como está seu código? Você está associando cada objeto colegiado ao objeto unidade a que a coleção pertence?

Coloque o mapeamento das duas classes e o código de inserção. Fica mais fácil de analisar.

rfgallon

Seguem as classes

import java.util.Date;

import javax.persistence.*;
import java.io.Serializable;

@Entity
public class Unidade implements Serializable {
	@Id
	@GeneratedValue
	@Column(unique = true, nullable = false) 
	private Integer id;
	@Column(length = 3)
	private String codigo;
	@Column(nullable = false, length = 60) 
	private String descricao;
	@Column(nullable = false) 
	private Date dtinicio;
	@Column(length = 40) 
	private String diretor;
	@Column(length = 40)
	private String campi;
	@Column(length = 40) 
	private String logradouro;
	@Column(length = 5)
	private String numero;
	@Column(length = 15) 
	private String complemento;
	@Column(length = 30)
	private String bairro;
	@Column(length = 9)
	private String cep;
	@Column(length = 30)
	private String municipio;
	@Column(length = 2)
	private String uf;
	@Column(length = 15) 
	private String fone;
	@Column(length = 15)
	private String fax;
	@Column(length = 60)
	private String email;
	@Column(length = 260)
	private String observacao;
	/**
	 * @return the id
	 */
	public Integer getId() {
		return id;
	}
	/**
	 * @param id the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}
	/**
	 * @return the codigo
	 */
	public String getCodigo() {
		return codigo;
	}
	/**
	 * @param codigo the codigo to set
	 */
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
	/**
	 * @return the descricao
	 */
	public String getDescricao() {
		return descricao;
	}
	/**
	 * @param descricao the descricao to set
	 */
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	/**
	 * @return the dtinicio
	 */
	public Date getDtinicio() {
		return dtinicio;
	}
	/**
	 * @param dtinicio the dtinicio to set
	 */
	public void setDtinicio(Date dtinicio) {
		this.dtinicio = dtinicio;
	}
	/**
	 * @return the diretor
	 */
	public String getDiretor() {
		return diretor;
	}
	/**
	 * @param diretor the diretor to set
	 */
	public void setDiretor(String diretor) {
		this.diretor = diretor;
	}
	/**
	 * @return the campi
	 */
	public String getCampi() {
		return campi;
	}
	/**
	 * @param campi the campi to set
	 */
	public void setCampi(String campi) {
		this.campi = campi;
	}
	/**
	 * @return the logradouro
	 */
	public String getLogradouro() {
		return logradouro;
	}
	/**
	 * @param logradouro the logradouro to set
	 */
	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}
	/**
	 * @return the numero
	 */
	public String getNumero() {
		return numero;
	}
	/**
	 * @param numero the numero to set
	 */
	public void setNumero(String numero) {
		this.numero = numero;
	}
	/**
	 * @return the complemento
	 */
	public String getComplemento() {
		return complemento;
	}
	/**
	 * @param complemento the complemento to set
	 */
	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}
	/**
	 * @return the bairro
	 */
	public String getBairro() {
		return bairro;
	}
	/**
	 * @param bairro the bairro to set
	 */
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}
	/**
	 * @return the cep
	 */
	public String getCep() {
		return cep;
	}
	/**
	 * @param cep the cep to set
	 */
	public void setCep(String cep) {
		this.cep = cep;
	}
	/**
	 * @return the municipio
	 */
	public String getMunicipio() {
		return municipio;
	}
	/**
	 * @param municipio the municipio to set
	 */
	public void setMunicipio(String municipio) {
		this.municipio = municipio;
	}
	/**
	 * @return the uf
	 */
	public String getUf() {
		return uf;
	}
	/**
	 * @param uf the uf to set
	 */
	public void setUf(String uf) {
		this.uf = uf;
	}
	/**
	 * @return the fone
	 */
	public String getFone() {
		return fone;
	}
	/**
	 * @param fone the fone to set
	 */
	public void setFone(String fone) {
		this.fone = fone;
	}
	/**
	 * @return the fax
	 */
	public String getFax() {
		return fax;
	}
	/**
	 * @param fax the fax to set
	 */
	public void setFax(String fax) {
		this.fax = fax;
	}
	/**
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}
	/**
	 * @param email the email to set
	 */
	public void setEmail(String email) {
		this.email = email;
	}
	/**
	 * @return the observacao
	 */
	public String getObservacao() {
		return observacao;
	}
	/**
	 * @param observacao the observacao to set
	 */
	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		return this.getId();
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Unidade) {
			Unidade unidade = (Unidade) obj;
			if (unidade.getId() == this.getId())
				return true;
			return false;
		}
		return false;
	}

}

Colegiado

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Colegiado implements Serializable {
	@Id
	@GeneratedValue
	@Column(unique = true, nullable = false) 
	private Integer id;
	@Column(nullable = false, length = 60) 
	private String descricao;
	@ManyToOne  
	@JoinColumn(name = "idunidade", nullable = false)  
	private Unidade unidade;
	@Column(length = 40)
	private String responsavel;
	@Column(length = 15)
	private String fone;
	@Column(length = 15)
	private String fax;
	@Column(length = 60)
	private String email;
	/**
	 * @return the id
	 */
	public Integer getId() {
		return id;
	}
	/**
	 * @param id the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}
	/**
	 * @return the descricao
	 */
	public String getDescricao() {
		return descricao;
	}
	/**
	 * @param descricao the descricao to set
	 */
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	/**
	 * @return the unidade
	 */
	public Unidade getUnidade() {
		return unidade;
	}
	/**
	 * @param unidade the unidade to set
	 */
	public void setUnidade(Unidade unidade) {
		this.unidade = unidade;
	}
	/**
	 * @return the responsavel
	 */
	public String getResponsavel() {
		return responsavel;
	}
	/**
	 * @param responsavel the responsavel to set
	 */
	public void setResponsavel(String responsavel) {
		this.responsavel = responsavel;
	}
	/**
	 * @return the fone
	 */
	public String getFone() {
		return fone;
	}
	/**
	 * @param fone the fone to set
	 */
	public void setFone(String fone) {
		this.fone = fone;
	}
	/**
	 * @return the fax
	 */
	public String getFax() {
		return fax;
	}
	/**
	 * @param fax the fax to set
	 */
	public void setFax(String fax) {
		this.fax = fax;
	}
	/**
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}
	/**
	 * @param email the email to set
	 */
	public void setEmail(String email) {
		this.email = email;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		return this.getId();
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Colegiado) {
			Colegiado colegiado = (Colegiado) obj;
			if (colegiado.getId() == this.getId())
				return true;
			return false;
		}
		return false;
	}

}

Estou usando Mentawai como framework MVC

Segue o código do ColegiadoAction

import java.util.List;
import java.util.Map;

import org.mentawai.converter.Convertable;
import org.mentawai.converter.Converter;
import org.mentawai.core.ActionException;
import org.mentawai.core.BaseAction;
import org.mentawai.validation.Validatable;
import org.mentawai.validation.Validator;

import br.com.technisoft.educacional.bean.Colegiado;
import br.com.technisoft.educacional.dao.BaseDAO;

public class ColegiadoAction extends BaseAction implements Validatable, Convertable {

	private BaseDAO<Colegiado,Integer> colegiadoDAO;
	
	public String execute() throws Exception {
		throw new ActionException("Nada Aqui !!!");
	}
	
	/* (non-Javadoc)
	 * @see org.mentawai.validation.Validatable#prepareValidator(org.mentawai.validation.Validator, java.lang.String)
	 */
	public void prepareValidator(Validator arg0, String arg1) {
		// TODO Auto-generated method stub
		
	}

	/* (non-Javadoc)
	 * @see org.mentawai.converter.Convertable#prepareConverters(java.util.Map, java.lang.String)
	 */
	public void prepareConverters(Map<String, Converter> arg0, String arg1) {
		// TODO Auto-generated method stub
		
	}
	
	public String show() {
        
        String keyword = input.getStringValue("keyword");
        
        Colegiado colegiado = new Colegiado();
        colegiado.setDescricao(keyword);
        
        List<Colegiado> colegiados = colegiadoDAO.findByExample(colegiado);
        
        output.setValue("keyword",keyword);
        output.setValue("colegiados",colegiados);
                
        return SUCCESS;

	}

	public String edit() {
        String id = input.getStringValue("id");
        if ("".equals(id) || id == null) {
            output.setValue("colegiado", new Colegiado());
        } else {
            output.setValue("colegiado", colegiadoDAO.get(Integer.valueOf(id)));
        }
        return SUCCESS;
    }
    
    public String save() {
        Colegiado colegiado = (Colegiado) input.getValue("colegiado");
        colegiadoDAO.saveOrUpdate(colegiado);
        return SUCCESS;
    }
    
    public String delete() {
        String id = input.getStringValue("id");
        if (id != null && !"".equals(id)) {
            Colegiado colegiado = colegiadoDAO.get(Integer.valueOf(id));
            colegiadoDAO.delete(colegiado);
        }
        return SUCCESS;
    }

}
rgf

No método

public String save() {  
     Colegiado colegiado = (Colegiado) input.getValue("colegiado");  
     colegiadoDAO.saveOrUpdate(colegiado);  
     return SUCCESS;  
 }

esse objeto colegiado possui um objeto unidade setado com o ID da unidade que será referenciado?

rfgallon

rgf
Obrigado pela ajuda, quem seta os valores é o framework que estou utilizando, estou achando que existe um bug que esta causando isso, pois fiz testes em outras versões e o comportamente foi outro

Vou verificar como pessoal do forum do mentawai para ver se alguém já viu o erro

rfgallon

Pessoal hoje pela manhã realizei alguns testes com Hibernate puro e funcionou corretamente, desta forma, encerro este tópico, e irei verificar o mentawai.
Obrigado a todos que ajudaram

Criado 21 de fevereiro de 2008
Ultima resposta 22 de fev. de 2008
Respostas 5
Participantes 2