Problema com persistencia de três tabelas

Olá, pessoal, estou tendo um problema com a persistencia de uma de minhas tabelas.
Tenho 3 tabelas uma chamada Doador, outras com os nomes de Receptor e Atendimento.
Percebam que Doador e Atendimento têm relacionamento ManyToOne e Receptor e Atendimento, OneToOne.
O problema é que consigo persistí-las individualmente, e simultaneamente consigo apenas persistir no atendimento o objeto receptor, Mas não estou persistindo a Lista de Doadores.
O problema está no momento que salvo, todos os dados que espero de receptor vêm, mas não os do Doador, não estou conseguindo submeter os valores selecionados.
Por via das dúvidas, estou também passando um converter.

Receptor:

package br.com.agets.dominio;

import java.io.Serializable;

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")
	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;
	}

}

Atendimento:

package br.com.agets.dominio;

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

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
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", targetEntity = Doador.class, fetch = FetchType.LAZY)
	private List<Doador> doadores;

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

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

	@OneToOne
	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;
	}

}

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.JoinColumn;
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
	@JoinColumn(name = "atendimento_id")
	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;
	}

}

MBean:

package br.com.agets.visao;

import java.util.ArrayList;
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.model.SelectItem;

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<Doador> ListaDoadores;
	private List<SelectItem> receptores;

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

	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<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 this.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;
	}

	/**
	 * @param receptores
	 *            the receptores to set
	 */
	public void setReceptores(List<SelectItem> receptores) {
		this.receptores = receptores;
	}

}

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="true"
				id="mensagem" globalOnly="false" 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:selectOneMenu id="receptor"
						value="#{atendimentoBean.atendimentoEdicao.receptor}"
						label="receptor" converter="receptorConverter" required="true"
						requiredMessage="Este valor é obrigatório">
						<f:selectItems value="#{atendimentoBean.receptores}"></f:selectItems>
					</h:selectOneMenu>
				</h:panelGroup>

				<h:outputLabel value="Doadores" />
				<h:panelGroup>
						


					<h:selectManyListbox size="5" converter="doadorConverter"
						value="#{atendimentoBean.atendimentoEdicao.doadores}">
						<f:selectItems value="#{atendimentoBean.doadores}"
							itemValue="#{atendimentoBean.atendimentoEdicao.doadores}"
							itemLabel="#{atendimentoBean.doadores}"></f:selectItems>
					</h:selectManyListbox>
				</h:panelGroup>

			</h:panelGrid>


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

Conversor usado:

package br.com.agets.conversores;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

import br.com.agets.dominio.Doador;
import br.com.agets.negocio.DoadorService;

@FacesConverter(value = "doadorConverter")
public class DoadorConverter implements Converter {
	public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
		if (value == null) {
			return null;
		}
		return new DoadorService().pesquisaPorId(Long.parseLong(value));
	}

	public String getAsString(FacesContext context, UIComponent component, Object object) throws ConverterException {
		if (object == null) {
			return null;
		}
		Doador doador = (Doador) object;
		return doador.getId().toString();
	}

}