Problema ao persistir em um lado de um relacionamento

Olá pessoal

Seguinte:
Tenho
Um receptor
Vários doadores
Um atendimento

Posso cadastrar indistintamente receptores e doadores.

Mas, na tela de “atendimento”, teria de associar vários doadores a apenas um receptor, e a eles um atendimento.

A idéia é que na tela de receptor, pudesse normalmente cadastrar um receptor e o mesmo acontecer no doador, embora no atendimento, possa associá-los lembrando das considerações acima.

O problema é que consigo apenas cadastarar o receptor e não o doador.
na tabela atendimento todos os valores estão corretos, assim como no receptor referentes aos mesmos, mas no caso de doador o campo id_atendimento está sempre vazio.

Entidade Doador

package br.com.agets.dominio;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "doador")
public class Doador implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue
	private Long id;

	@ManyToOne
	private Atendimento atendimento;

	@Column(name = "nomeDoador")
	private String nomeDoador;

	@Column(name = "tipoHemoDerivados")
	@Enumerated(EnumType.STRING)
	private TipoHemoderivado tipoHemo;

	@Column(name = "tipoSanguineo")
	@Enumerated(EnumType.STRING)
	private TipoSanguineo tipoSanguineo;

	@Column(name = "dataEntrada")
	@Temporal(TemporalType.DATE)
	private Date dataEntrada;

	@Column(name = "numDoacao")
	private String numeroDoacao;

	@Column(name = "produto")
	private String produto;

	@Column(name = "volume")
	private String volume;

	@Column(name = "PAI")
	private String PAI;

	@Column(name = "sifilis", insertable = false, length = 13)
	private String sifilis;

	@Column(name = "chagas", insertable = false, length = 13)
	private String chagas;

	@Column(name = "epatiteB", insertable = false, length = 13)
	private String epatiteB;

	@Column(name = "epatiteC", insertable = false, length = 13)
	private String epatiteC;

	@Column(name = "HIV", insertable = false, length = 13)
	private String HIV;

	@Column(name = "HTLV", insertable = false, length = 13)
	private String HTLV;

	@Column(name = "destino")
	@Enumerated(EnumType.STRING)
	private TipoDestino destino;

	@Column(name = "Obs")
	private String Observacoes;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Atendimento getAtendimento() {
		return atendimento;
	}

	public void setAtendimento(Atendimento atendimento) {
		this.atendimento = atendimento;
	}

	public String getNomeDoador() {
		return nomeDoador;
	}

	public void setNomeDoador(String nomeDoador) {
		this.nomeDoador = nomeDoador;
	}

	public TipoHemoderivado getTipoHemo() {
		return tipoHemo;
	}

	public void setTipoHemo(TipoHemoderivado tipoHemo) {
		this.tipoHemo = tipoHemo;
	}

	public Date getDataEntrada() {
		return dataEntrada;
	}

	public void setDataEntrada(Date dataEntrada) {
		this.dataEntrada = dataEntrada;
	}

	public String getNumeroDoacao() {
		return numeroDoacao;
	}

	public void setNumeroDoacao(String numeroDoacao) {
		this.numeroDoacao = numeroDoacao;
	}

	public String getProduto() {
		return produto;
	}

	public void setProduto(String produto) {
		this.produto = produto;
	}

	public String getVolume() {
		return volume;
	}

	public void setVolume(String volume) {
		this.volume = volume;
	}

	public String getPAI() {
		return PAI;
	}

	public void setPAI(String pAI) {
		PAI = pAI;
	}

	public String getSifilis() {
		return sifilis;
	}

	public void setSifilis(String sifilis) {
		this.sifilis = sifilis;
	}

	public String getChagas() {
		return chagas;
	}

	public void setChagas(String chagas) {
		this.chagas = chagas;
	}

	public String getEpatiteB() {
		return epatiteB;
	}

	public void setEpatiteB(String epatiteB) {
		this.epatiteB = epatiteB;
	}

	public String getEpatiteC() {
		return epatiteC;
	}

	public void setEpatiteC(String epatiteC) {
		this.epatiteC = epatiteC;
	}

	public String getHIV() {
		return HIV;
	}

	public void setHIV(String hIV) {
		HIV = hIV;
	}

	public String getHTLV() {
		return HTLV;
	}

	public void setHTLV(String hTLV) {
		HTLV = hTLV;
	}

	public TipoDestino getDestino() {
		return destino;
	}

	public void setDestino(TipoDestino destino) {
		this.destino = destino;
	}

	public String getObservacoes() {
		return Observacoes;
	}

	public void setObservacoes(String observacoes) {
		Observacoes = observacoes;
	}

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

	public TipoSanguineo getTipoSanguineo() {
		return tipoSanguineo;
	}

	public void setTipoSanguineo(TipoSanguineo tipoSanguineo) {
		this.tipoSanguineo = tipoSanguineo;
	}

}

Entidade Receptor

package br.com.agets.dominio;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name = "receptor")
public class Receptor implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue
	private Long id;

	@Column(name = "nomeReceptor")
	private String nomeReceptor;

	@Column(name = "nomeHospital")
	private String nomeHospital;

	@Column(name = "numProntuario")
	private String numProntuario;

	@Column(name = "tipoSanguineo")
	@Enumerated(EnumType.STRING)
	private TipoSanguineo tipoSanguineo;

	@OneToOne(mappedBy = "receptor", cascade = CascadeType.ALL)
	private Atendimento atendimento;

	@Column(name = "RH")
	private String RH;

	@Column(name = "PAI")
	private String PAI;

	@Column(name = "numDoacao")
	private String numDoacao;

	@Column(name = "hemoDerivados")
	@Enumerated(EnumType.STRING)
	private TipoHemoderivado tipoHemo;

	@Column(name = "volume")
	private String volume;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNomeReceptor() {
		return nomeReceptor;
	}

	public void setNomeReceptor(String nomeReceptor) {
		this.nomeReceptor = nomeReceptor;
	}

	public String getNomeHospital() {
		return nomeHospital;
	}

	public void setNomeHospital(String nomeHospital) {
		this.nomeHospital = nomeHospital;
	}

	public String getNumProntuario() {
		return numProntuario;
	}

	public void setNumProntuario(String numProntuario) {
		this.numProntuario = numProntuario;
	}

	public TipoSanguineo getTipoSanguineo() {
		return tipoSanguineo;
	}

	public void setTipoSanguineo(TipoSanguineo tipoSanguineo) {
		this.tipoSanguineo = tipoSanguineo;
	}

	public String getRH() {
		return RH;
	}

	public void setRH(String rH) {
		RH = rH;
	}

	public String getPAI() {
		return PAI;
	}

	public void setPAI(String pAI) {
		PAI = pAI;
	}

	public String getNumDoacao() {
		return numDoacao;
	}

	public void setNumDoacao(String numDoacao) {
		this.numDoacao = numDoacao;
	}

	public TipoHemoderivado getTipoHemo() {
		return tipoHemo;
	}

	public void setTipoHemo(TipoHemoderivado tipoHemo) {
		this.tipoHemo = tipoHemo;
	}

	public String getVolume() {
		return volume;
	}

	public void setVolume(String volume) {
		this.volume = volume;
	}

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

	public Atendimento getAtendimento() {
		return atendimento;
	}

	public void setAtendimento(Atendimento atendimento) {
		this.atendimento = atendimento;
	}

}

Entidade Atendimento

package br.com.agets.dominio;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "atendimento")
public class Atendimento implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private Long id;

	@OneToMany(mappedBy = "atendimento")
	private List<Doador> doadores;

	public List<Doador> getDoadores() {
		return doadores;
	}

	public void setDoadores(List<Doador> doadores) {
		this.doadores = doadores;
	}

	@OneToOne(cascade = CascadeType.ALL)
	private Receptor receptor;

	@Column(name = "dataAtendimento")
	@Temporal(TemporalType.DATE)
	private Date dataAtendimento;

	@Column(name = "numOrdem")
	private String numeroOrdem;

	@Column(name = "testeCompatibilidade")
	private boolean testeCompatibilidade;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Receptor getReceptor() {
		return receptor;
	}

	public Date getDataAtendimento() {
		return dataAtendimento;
	}

	public void setDataAtendimento(Date dataAtendimento) {
		this.dataAtendimento = dataAtendimento;
	}

	public String getNumeroOrdem() {
		return numeroOrdem;
	}

	public void setNumeroOrdem(String numeroOrdem) {
		this.numeroOrdem = numeroOrdem;
	}

	public boolean isTesteCompatibilidade() {
		return testeCompatibilidade;
	}

	public void setTesteCompatibilidade(boolean testeCompatibilidade) {
		this.testeCompatibilidade = testeCompatibilidade;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Atendimento other = (Atendimento) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	public void setReceptor(Receptor receptor) {
		this.receptor = receptor;
	}

}

MBean


package br.com.agets.visao;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

import org.richfaces.component.UIExtendedDataTable;

import br.com.agets.dominio.Atendimento;
import br.com.agets.dominio.Doador;
import br.com.agets.dominio.Receptor;
import br.com.agets.dominio.TipoHemoderivado;
import br.com.agets.dominio.TipoSanguineo;
import br.com.agets.negocio.AtendimentoService;
import br.com.agets.negocio.DoadorService;
import br.com.agets.negocio.ReceptorService;
import br.com.agets.negocio.RegraNegocioException;

@ManagedBean(name = "atendimentoBean")
@SessionScoped
public class AtendimentoBean {

	private Atendimento atendimentoEdicao;
	private List<Atendimento> atendimentos = new ArrayList<Atendimento>();
	private List<SelectItem> tiposHemoderivados;
	private List<SelectItem> tiposSanguineos;
	private List<SelectItem> doadores;
	private List<SelectItem> receptores;
	private List<Doador> ListaDoadores;
	private List<Receptor> ListaReceptores;
	private Collection<Object> selection;
	private List<Receptor> selectionItems = new ArrayList<Receptor>();

	public String inicializar() {
		this.atendimentoEdicao = new Atendimento();
		this.tiposHemoderivados = null;
		this.tiposSanguineos = null;
		this.atendimentos = null;
		this.receptores = null;
		this.doadores = null;
		this.ListaReceptores = null;
		this.ListaDoadores = null;
		return "incluirAtendimento2";
	}

	public Collection<Object> getSelection() {
		return selection;
	}

	public void setSelection(Collection<Object> selection) {
		this.selection = selection;
	}

	public List<Receptor> getSelectionItems() {
		return selectionItems;
	}

	public void setSelectionItems(List<Receptor> selectionItems) {
		this.selectionItems = selectionItems;
	}

	public void selectionListener(AjaxBehaviorEvent event) {
		System.out.println("CHamando o método de seleção");
		UIExtendedDataTable dataTable = (UIExtendedDataTable) event.getComponent();
		Object originalKey = dataTable.getRowKey();
		selectionItems.clear();
		for (Object selectionkey : selection) {
			dataTable.setRowKey(selectionkey);
			if (dataTable.isRowAvailable()) {
				selectionItems.add((Receptor) dataTable.getRowData());
			}
		}
		dataTable.setRowKey(originalKey);
	}

	public void salvar(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			new AtendimentoService().salvar(this.atendimentoEdicao);
			this.atendimentoEdicao = new Atendimento();
			FacesMessage msg = new FacesMessage("Atendimento Cadastrado com sucesso!");
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
		} catch (RegraNegocioException e) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage("Erro inesperado ao cadastrar atendimento! " + e.getMessage());
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, msg);
		}
	}

	public List<String> sugerirNomeReceptor(Object event) {
		return new ReceptorService().pesquisarReceptores(event.toString());

	}

	public void excluir() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			new AtendimentoService().excluir(this.atendimentoEdicao);
			this.atendimentos.remove(this.atendimentoEdicao);
			FacesMessage msg = new FacesMessage("Atendimento excluído com sucesso!");
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
		} catch (RegraNegocioException e) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage("Erro inesperado ao excluir atendimento!");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, msg);
		}
	}

	public List<Receptor> getListaReceptores() {
		if (this.ListaReceptores == null) {
			this.ListaReceptores = new ReceptorService().listarTodos();
		}
		return this.ListaReceptores;

	}

	public List<Doador> getListaDoadores() {
		if (this.ListaDoadores == null) {
			this.ListaDoadores = new DoadorService().listarTodos();
		}
		return this.ListaDoadores;

	}

	public List<SelectItem> getDoadores() {
		if (this.doadores == null) {
			this.doadores = new ArrayList<SelectItem>();
			List<Doador> doadores = new DoadorService().listarTodos();
			this.doadores.add(new SelectItem(null, "Selecione"));
			for (Doador doador : doadores) {
				this.doadores.add(new SelectItem(doador, doador.getNomeDoador()));

			}
		}
		return this.doadores;
	}

	public List<SelectItem> getReceptores() {
		if (this.receptores == null) {
			this.receptores = new ArrayList<SelectItem>();
			List<Receptor> receptores = new ReceptorService().listarTodos();
			this.receptores.add(new SelectItem(null, "Selecione"));
			for (Receptor receptor : receptores) {
				this.receptores.add(new SelectItem(receptor, receptor.getNomeReceptor()));
			}
		}
		return receptores;

	}

	public List<SelectItem> getTiposHemoderivados() {
		if (this.tiposHemoderivados == null) {
			this.tiposHemoderivados = new ArrayList<SelectItem>();
			this.tiposHemoderivados.add(new SelectItem(null, "Selecione"));
			for (TipoHemoderivado tipos : TipoHemoderivado.values()) {
				this.tiposHemoderivados.add(new SelectItem(tipos.toString()));
			}
		}
		return tiposHemoderivados;
	}

	public List<SelectItem> getTiposSanguineos() {
		if (this.tiposSanguineos == null) {
			this.tiposSanguineos = new ArrayList<SelectItem>();
			this.tiposSanguineos.add(new SelectItem(null, "Selecione"));
			for (TipoSanguineo tipos : TipoSanguineo.values()) {
				this.tiposSanguineos.add(new SelectItem(tipos.toString()));
			}
		}
		return tiposSanguineos;
	}

	public Atendimento getAtendimentoEdicao() {
		return atendimentoEdicao;
	}

	public void setAtendimentoEdicao(Atendimento atendimentoEdicao) {
		this.atendimentoEdicao = atendimentoEdicao;
	}

	public List<Atendimento> getAtendimentos() {
		return atendimentos;
	}

	public void setAtendimentos(List<Atendimento> atendimentos) {
		this.atendimentos = atendimentos;
	}

	public void setListaDoadores(List<Doador> listaDoadores) {
		ListaDoadores = listaDoadores;
	}

	public void setTiposHemoderivados(List<SelectItem> tiposHemoderivados) {
		this.tiposHemoderivados = tiposHemoderivados;
	}

	public void setTiposSanguineos(List<SelectItem> tiposSanguineos) {
		this.tiposSanguineos = tiposSanguineos;
	}

	public void setDoadores(List<SelectItem> doadores) {
		this.doadores = doadores;
	}

	public void setReceptores(List<SelectItem> receptores) {
		this.receptores = receptores;
	}

	/**
	 * @param listaReceptores
	 *            the listaReceptores to set
	 */
	public void setListaReceptores(List<Receptor> listaReceptores) {
		ListaReceptores = listaReceptores;
	}

}

Página

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich">
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"></meta>
	<title>Cadastro de atendimentos</title>



</h:head>
<h:body>
	<f:view>
		<h1>
			<h:outputText value="Cadastro de atendimentos"></h:outputText>
		</h1>
		<h:form>
			<a4j:poll render="mensagem" interval="5000"></a4j:poll>
			<h:messages layout="table" showSummary="true" showDetail="false"
				id="mensagem" globalOnly="true" styleClass="msgErro"
				infoClass="msgInfo" style="font-weight: bold" />

			<h:panelGrid columns="2">

				<h:outputLabel value="Código:"
					rendered="#{atendimentoBean.atendimentoEdicao.id !=null}" />
				<h:panelGroup
					rendered="#{atendimentoBean.atendimentoEdicao.id !=null}">
					<h:inputText required="true" id="codigo_ate"
						value="#{atendimentoBean.atendimentoEdicao.id}"
						label="Código do atendimento" disabled="true" />
					<h:message for="codigo_ate" showSummary="true" showDetail="false" />
				</h:panelGroup>

				<h:outputLabel value="Data do atendimento" />
				<h:panelGroup>
					<rich:calendar id="dataentrada" enableManualInput="true"
						value="#{atendimentoBean.atendimentoEdicao.dataAtendimento}"
						required="true" requiredMessage="Este valor é obrigatório"
						locale="pt_BR" datePattern="dd/MM/yyyy">
						<h:message for="dataentrada" showSummary="true" showDetail="false">
						</h:message>
					</rich:calendar>
				</h:panelGroup>

				<h:outputLabel value="Número de ordem" />
				<h:panelGroup>
					<h:inputText id="numordem"
						value="#{atendimentoBean.atendimentoEdicao.numeroOrdem}"
						required="true" size="40"
						requiredMessage="Este valor é obrigatório" />
					<h:message for="numordem" showSummary="true" showDetail="false"
						styleClass="msgErro">
					</h:message>
				</h:panelGroup>

				<h:outputLabel value="Teste de compatibilidade" />
				<h:panelGroup>
					<h:selectOneRadio id="compatibilidade" required="true"
						requiredMessage="Este valor é obrigatório"
						value="#{atendimentoBean.atendimentoEdicao.testeCompatibilidade}"
						label="Teste de compatibilidade" layout="pageDirection">
						<f:selectItem itemValue="true" itemLabel="Aprovado" />
						<f:selectItem itemValue="false" itemLabel="Reprovado" />
					</h:selectOneRadio>
					<h:message for="compatibilidade" showSummary="true"
						showDetail="false" styleClass="msgErro">
					</h:message>
				</h:panelGroup>

				<h:outputLabel value="Receptor" />
				<h:panelGroup>
					<h:commandButton value="Definir Receptor">
						<rich:componentControl target="popup" operation="show"></rich:componentControl>
					</h:commandButton>
				</h:panelGroup>

				<h:outputLabel value="Receptor" />
				<h:panelGroup>
					<h:selectOneMenu id="receptor"
						value="#{atendimentoBean.atendimentoEdicao.receptor}"
						label="receptor" converter="receptorConverter" required="false"
						requiredMessage="Este valor é obrigatório">
						<f:selectItems value="#{atendimentoBean.receptores}"></f:selectItems>
					</h:selectOneMenu>
				</h:panelGroup>

				<h:outputLabel value="Doador" />
				<h:panelGroup>
					<h:selectManyListbox id="doador"
						value="#{atendimentoBean.atendimentoEdicao.doadores}"
						label="receptor" converter="doadorConverter" required="false"
						requiredMessage="Este valor é obrigatório">
						<f:selectItems value="#{atendimentoBean.doadores}"></f:selectItems>
					</h:selectManyListbox>

				</h:panelGroup>

				<rich:popupPanel id="popup" modal="false" resizeable="true">
					<f:facet name="header">
						<h:outputText value="Defina o Receptor"></h:outputText>
					</f:facet>

					<f:facet name="controls">
						<h:outputLink value="#" style="text-decoration:none;"
							onclick="#{rich:component('popup')}.hide(); return false;">X</h:outputLink>
					</f:facet>

				</rich:popupPanel>
				<h:outputLabel value="Nome do Receptor Escolhido" />
				<h:outputText id="dados"
					value="#{atendimentoBean.atendimentoEdicao.receptor.nomeReceptor}" />
			</h:panelGrid>


			<h:commandButton value="Salvar"
				actionListener="#{atendimentoBean.salvar}" />
			<h:commandButton value="Voltar" immediate="true" action="menu" />
		</h:form>
	</f:view>
</h:body>
</html>

DAO

package br.com.agets.dao.hibernate;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;

import org.hibernate.Session;

import br.com.agets.dao.GenericDAO;

public abstract class HibernateGenericDAO<T> implements GenericDAO<T> {
	private Class<T> persistentClass;
	private Session session;

	@SuppressWarnings("unchecked")
	public HibernateGenericDAO(Session session) {
		this.session = session;
		this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
	}

	public Session getSession() {
		return this.session;
	}

	@SuppressWarnings("unchecked")
	public T pesquisarPorId(Serializable id) {
		return (T) this.session.get(this.persistentClass, id);
	}

	@SuppressWarnings("unchecked")
	public List<T> listarTodos() {
		return this.session.createCriteria(this.persistentClass).list();
	}

	@SuppressWarnings("unchecked")
	public T salvar(T entidade) {
		return (T) this.session.merge(entidade);
	}

	public void excluir(T entidade) {
		this.session.delete(entidade);
	}
}

ninguém?

Já experimentou usar o column para o ID também?

Acho eu que o relacionamento OneToMany no caso do receptor-doador não seria bidirecional, pois um recptor não precisa ter necessariamento muitos doadores.

OLá Mathe, tudo bem.
Pode me explicar melhor como fazer esse "usar o column para o ID ", como disse?
Farei hoje à tarde às 13:30 +~- e postarei a resposta, se me ajudar.
Agradeço desde já.

Mathe, nesse caso, um receptor, necessariamente precisa ter vários doadores.

Como é o caso de um software de um banco de sangue, quando haver um receptor, uma “grande seleção”, digamos assim, de bolsas de sangue são combinadas e assim essas são usadas para o receptor, vindas de vários doadores, então, por isso, penso que será necessário.

Hmm, o que eu estava querendo dizer é que se o id é o classico numerador, vc poderia tentar colocar as seguintes annotations acima dele por orem de cima pra baixo.

@Id
@GeneratedValue
@Column(name=“nome da coluna que fica o id no seu banco.”)

Vou por então um nome na coluna id.
Posto agora a resposta.

bem, não funcionou, e ainda ficou estranho um campo em atendimento com o nome receptor_id_receptor, assim como atendimento_id_atendmento em doador, que por sinal, este último ainda está vazio.

o que está acontecendo é que vc não esta mandando um objeto completo para o banco, aciona isso no formulario de cadastro de receptor <h:inputHidden value="#{receptorBean.id}"/>

ele terminara de alimentar o objeto receptor ficando completo para ir para o banco, faça o teste ai ;D

Beleza, Mathe, mas o receptor está “zerado” o problema que me aflige é o doador…

[quote=smnj]Beleza, Mathe, mas o receptor está “zerado” o problema que me aflige é o doador…
[/quote]

Hmm pelo que pude percebe ali vc qér escolher o doador por uma lista, mas em qual página vc está cadastrando os doadores para poder usar nessa lista?

É uma pagina “à parte”, por assim dizer, mas para o cadastro, eu faço normalmente, e indistiontamente, o problema é associar o que existe a um atendimento.

[quote=smnj]É uma pagina “à parte”, por assim dizer, mas para o cadastro, eu faço normalmente, e indistiontamente, o problema é associar o que existe a um atendimento.
[/quote]

Vejamos que vc está utilizando isso na entidade para efetuar o relacionamento

   @ManyToOne  
    private Atendimento atendimento;  

E o campo que está na tabela doador é id_atendimento… tenta mudar o nome dessa propriedade para id_atendimento pro hibernate reconhecer automaticamente.

vai ter que mudar também

    @OneToMany(mappedBy = "atendimento")  
    private List&lt;Doador&gt; doadores;  

para

    @OneToMany(mappedBy = "id_atendimento")  
    private List&lt;Doador&gt; doadores;  

Nem gera o banco, dá excessão.

Exception in thread "main" org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: br.com.agets.dominio.Doador.id_atendimento in br.com.agets.dominio.Atendimento.doadores

vem ca como é que tao as tabelas no banco?

Você quer o SQL?

sim

Receptor:

CREATE DATABASE  IF NOT EXISTS 

DROP TABLE IF EXISTS `receptor`;

CREATE TABLE `receptor` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `PAI` varchar(255) DEFAULT NULL,
  `RH` varchar(255) DEFAULT NULL,
  `nomeHospital` varchar(255) DEFAULT NULL,
  `nomeReceptor` varchar(255) DEFAULT NULL,
  `numDoacao` varchar(255) DEFAULT NULL,
  `numProntuario` varchar(255) DEFAULT NULL,
  `hemoDerivados` varchar(255) DEFAULT NULL,
  `tipoSanguineo` varchar(255) DEFAULT NULL,
  `volume` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Atendimento:

CREATE DATABASE  IF NOT EXISTS `agets` 
DROP TABLE IF EXISTS `atendimento`;
CREATE TABLE `atendimento` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `dataAtendimento` date DEFAULT NULL,
  `numOrdem` varchar(255) DEFAULT NULL,
  `testeCompatibilidade` bit(1) DEFAULT NULL,
  `receptor_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKA0FBA5D03674FB76` (`receptor_id`),
  CONSTRAINT `FKA0FBA5D03674FB76` FOREIGN KEY (`receptor_id`) REFERENCES `receptor` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Doador:

CREATE DATABASE  IF NOT EXISTS `agets`
USE `agets`;
DROP TABLE IF EXISTS `doador`;

CREATE TABLE `doador` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `HIV` varchar(13) DEFAULT NULL,
  `HTLV` varchar(13) DEFAULT NULL,
  `Obs` varchar(255) DEFAULT NULL,
  `PAI` varchar(255) DEFAULT NULL,
  `chagas` varchar(13) DEFAULT NULL,
  `dataEntrada` date DEFAULT NULL,
  `destino` varchar(255) DEFAULT NULL,
  `epatiteB` varchar(13) DEFAULT NULL,
  `epatiteC` varchar(13) DEFAULT NULL,
  `nomeDoador` varchar(255) DEFAULT NULL,
  `numDoacao` varchar(255) DEFAULT NULL,
  `produto` varchar(255) DEFAULT NULL,
  `sifilis` varchar(13) DEFAULT NULL,
  `tipoHemoDerivados` varchar(255) DEFAULT NULL,
  `tipoSanguineo` varchar(255) DEFAULT NULL,
  `volume` varchar(255) DEFAULT NULL,
  `atendimento_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `FKB0EE6C51F400C2FE` (`atendimento_id`),
  CONSTRAINT `FKB0EE6C51F400C2FE` FOREIGN KEY (`atendimento_id`) REFERENCES `atendimento` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Apesar de trazer valores, você acredita que pode ter alguma coisa errada com o converter?

O sql me parece estar correto, e enquanto ao converter se não tivesse funcionando não traria valores.