Dúvida com Arquitetura JSF

Pessoal estou com uma dúvida de arquitetura em jsf, gostaria da opinião de vocês de como devo proceder, é o seguinte tenho uma entidade Licitacao, a entidade licitação por sua vez faz referência às entidades Modalidade,Tipo Objeto e Tipo Licitação(que serão representadas com comboboxes na view), estou usando EJB, com minhas entidades e meus sessions beans que fazem a persistencia dos dados.
Na view tenho meus managed Beans e minhas classes service,onde os managed beans apenas capturam ações dos usuários e passam para a service tratar e a camada service comunica com os sessions beans.

A dúvida é a seguinte,pra essa view vou precisar carregar esses 3 combobox,como fica isso no service? crio uma LicitacaoService e nela coloco a lista de modalidades,tipos objeto e tipos licitação? ou então crio um ModalidadeService, TipoLicitaçãoService,TipoObjetoService para cada um retornar suas devidas listas? é comum chamar várias services do meu managed bean? como vocês trabalham nesses casos onde em uma view eu vou precisar de várias listas para preencher várias combos,datatables etc…?

LicitacaoService



@Stateless
public class LicitacaoService {


    @EJB
	private  LicitacaoFacadeLocal licitacaoFacadeLocal ;
    @EJB
	private   ModalidadeLicitacaoFacadeLocal modalidadeLicitacaoFacadeLocal;
    @EJB
	private TipoLicitacaoFacadeLocal tipoLicitacaoFacadeLocal;
    @EJB
	private ItemLoteFacadeLocal itemLoteFacadeLocal ;
    @EJB
	private TipoObjetoFacadeLocal tipoObjetoFacadeLocal;
    @EJB
	private  OrigemRecursoFacadeLocal origemRecursoFacadeLocal;
    @EJB
	private StatusFacadeLocal statusFacadeLocal;
    @EJB
	private OrgaoFacadeLocal orgaoFacadeLocal;
    @EJB
	private  RevisaoFacadeLocal revisaoFacadeLocal;


	public static final String URI ="java:global/licitacaoEAR/licitacao_server/br.com.lrxsistemas.server.licitacao.LicitacaoService";


	public void salvarOuAtualizar(Licitacao licitacao) throws BusinessException,InfraException{
		
		try{
			
		validaLicitacao(licitacao);
		 if(licitacao.getLicitacaoId() != null ){
				licitacaoFacadeLocal.create(licitacao);
		 }else{
			    if(licitacao.getStatus().getNome().equalsIgnoreCase("CONCLUIDA") || licitacao.getStatus().getNome().equalsIgnoreCase("EM REVISÃO")){
			    	
			    	throw new BusinessException("Não é possível editar licitações concluidas ou em revisão");
			    }
				licitacaoFacadeLocal.edit(licitacao);
		 }
		}catch(Exception e){
			
			throw new InfraException("Ocorreu um erro de persistência",e);
		}
	}
	
	

	private void validaLicitacao(Licitacao licitacao) throws BusinessException{
		
		try{
		
		if(licitacao.getNumeroProcesso()== null || licitacao.getNumeroProcesso().equals("") || licitacao.getAnoProcesso()== null || licitacao.getAnoProcesso().equals("")){
			throw new BusinessException("Preencha o campo n�mero do processo administrativo!");
		}
		if(licitacao.getNumeroInstrumentoConvocatorio()== null || licitacao.getNumeroInstrumentoConvocatorio().length()== 0){
			throw new BusinessException("Preencha o campo n�mero do n�mero do instrumento convocat�rio!");
		}
		if(licitacao.getModalidadeLicitacao()== null || licitacao.getModalidadeLicitacao().getModalidadeLicitacaoId()== 0){
			throw new BusinessException("Preencha o campo modalidade da licita��o!");
		}
		if(licitacao.getTipoLicitacao()== null || licitacao.getTipoLicitacao().getTipoLicitacaoId()==null){
			throw new BusinessException("Preencha o campo tipo da licita��o!");
		}
		if(licitacao.getTipoObjeto()== null || licitacao.getTipoObjeto().getTipoObjetoId()== null){
			throw new BusinessException("Preencha o campo tipo do objeto!");
		}
		if(licitacao.getOrigemRecurso()== null || licitacao.getOrigemRecurso().getOrigemRecursoId()==null){
			throw new BusinessException("Preencha o campo origem recurso!");
		}
		}catch(NullPointerException e){
			
			throw new BusinessException("referência nula para o objeto licitação",e);
		}
		
	}
	
	
	
	public void  salvarEnviar(Licitacao licitacao) throws BusinessException,InfraException{
		
		try {
			 if(licitacao.getStatus().getNome().equalsIgnoreCase("CONCLUIDA") || licitacao.getStatus().getNome().equalsIgnoreCase("EM REVISÃO")){
			    	
			    	throw new BusinessException("Não é possível editar licitações concluidas ou em revisão");
			    }
			validaLicitacao(licitacao);
			Status status = statusFacadeLocal.find(2);
			licitacao.setStatus(status);
			licitacaoFacadeLocal.edit(licitacao);
		} catch (Exception e) {
	
			throw new InfraException("Ocorreu um erro de persistência",e);
		}
	}
	
	
	public Licitacao find(int licitacaoId)throws BusinessException,InfraException{
		
		try {
			Licitacao licitacao = licitacaoFacadeLocal.find(licitacaoId);
			return licitacao;
		} catch (NullPointerException e) {
			throw new BusinessException("Erro ao recuperar licitação",e);
		}catch(Exception e){
			throw new InfraException("Erro na busca",e);
		}
		
	}
	
	
	
	public void carregarRevisoesLicitacao(Licitacao licitacao){
		
		List<Revisao> revisaoList = revisaoFacadeLocal.findRevisaoByLicitacao(licitacao.getLicitacaoId(),'S');
		licitacao.setRevisaoList(revisaoList);	
	}
	
	
	
	public void removerLicitacao(Licitacao licitacao) throws BusinessException,InfraException{
		try{
			if(licitacao.getStatus().getNome().equalsIgnoreCase("CONCLUIDA") || licitacao.getStatus().getNome().equalsIgnoreCase("EM REVISÃO")){
		    	
		    	throw new BusinessException("Não é possível remover licitações concluidas ou em revisão ");
		    }
		licitacaoFacadeLocal.delete(licitacao.getLicitacaoId());
		}catch(Exception e){
			
			throw new InfraException("Ocorreu um erro de persistência",e);

		}
	}
	

	
	public List<Licitacao>pesquisarLicitacao(Orgao orgao,TipoLicitacao tipo,ModalidadeLicitacao modalidade,Status status,String objeto) throws InfraException{

		return licitacaoFacadeLocal.buscarLicitacoes(orgao, tipo, modalidade,status, objeto);
	}
	
	
	public List<Licitacao> pesquisarLicitacaoProcesso(Orgao orgao,String numeroProcesso,String anoProcesso)throws BusinessException, InfraException{
		
		try{
		if(orgao == null ){
			throw new BusinessException("Informe o Órgão");
		}
		if(numeroProcesso == null || numeroProcesso.equalsIgnoreCase("")){
			throw new BusinessException("Informe o número do processo");	
		}
		if(anoProcesso == null || anoProcesso.equalsIgnoreCase("")){
			throw new BusinessException("Informe o ano do processo");	
		}
		
		return  licitacaoFacadeLocal.buscarLicitacaoPorProcesso(orgao,numeroProcesso, anoProcesso);
		}catch(Exception e){
			
			throw new InfraException("Ocorreu um erro na busca",e);

		}
	}
	
	
	
	public List<Licitacao>pesquisarLicitacaoProcedimento(Orgao orgao,String numeroInstrumento,String anoInstrumento) throws BusinessException, InfraException{
		
		try {
			if(orgao == null ){
				throw new BusinessException("Informe o Órgão");
			}
			if(numeroInstrumento == null || numeroInstrumento.equalsIgnoreCase("")){
				throw new BusinessException("Informe o número do instrumento convocatório");	
			}
			if(anoInstrumento == null || anoInstrumento.equalsIgnoreCase("")){
				throw new BusinessException("Informe o ano do instrumento convocatório");	
			}
			
			return licitacaoFacadeLocal.buscarLicitacaoPorNumeroInstrumentoConvocatorio(orgao,numeroInstrumento, anoInstrumento);
		} catch (Exception e) {
			
			throw new InfraException("Ocorreu um erro na busca",e);

		}
	}
	
	

	
public List<ModalidadeLicitacao> carregarModalidadesLicitacoes(){
		
		return modalidadeLicitacaoFacadeLocal.findAll();
	}
	
	
	public List<TipoLicitacao> carregarTiposLicitacao(){
		
		return tipoLicitacaoFacadeLocal.findAll();
	}
	
	
	public List<ItemLote>carregarItensLote(){
		
		return itemLoteFacadeLocal.findAll();
	}
	
	
	public List<TipoObjeto>carregarTiposObjeto(){
		
		return tipoObjetoFacadeLocal.findAll();
	}
	
	
	public List<OrigemRecurso> carregarOrigensRecurso(){
		
		return origemRecursoFacadeLocal.findAll();
	}
	
	
	
	public List<Status> carregarStatus(){
		
		return statusFacadeLocal.findAll();
	}

}

LicitacaoFacade

@Stateless
public class LicitacaoFacade extends AbstractFacade<Licitacao> implements LicitacaoFacadeLocal {
	@PersistenceContext(unitName = "licitacao_server1PU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}

	public LicitacaoFacade() {
		super(Licitacao.class);
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Licitacao> buscarLicitacaoPorNumeroInstrumentoConvocatorio(Orgao orgao,String numeroInstrumento,String anoInstrumento){

		
		Query q = em.createQuery("select l from Licitacao l where l.numeroInstrumentoConvocatorio =:arg0 and l.anoInstrumentoConvocatorio =:arg3 and l.orgao.orgaoId =:arg1")
				.setParameter("arg0",numeroInstrumento)
				.setParameter("arg3",anoInstrumento)
				.setParameter("arg1",orgao.getOrgaoId());
	
		return (ArrayList<Licitacao>)q.getResultList();
	}
	
	
	public void delete(int id){
		
		
			Licitacao licitacaoToRemove = em.find(Licitacao.class, id);
			em.remove(licitacaoToRemove);
		
		
	}

	public List<Licitacao> buscarLicitacaoPorProcesso(Orgao orgao,String numero,String ano){

		Licitacao licitacao= null;
		Query q = em.createQuery("select l from Licitacao l where l.numeroProcesso =:arg0 and l.anoProcesso=:arg1 and l.orgao.orgaoId =:arg2 ")
				.setParameter("arg0",numero)
				.setParameter("arg1",ano)
				.setParameter("arg2",orgao.getOrgaoId());
		return q.getResultList();
	}


	public List<Licitacao> buscarLicitacoes(Orgao orgao,TipoLicitacao tipoLicitacao,ModalidadeLicitacao modalidadeLicitacao,
			Status status, String objeto){
		
		List<Licitacao> licitacoes = new ArrayList<Licitacao>();
		HashMap<String, Object> params = new HashMap<String, Object>();
		StringBuffer hql = new StringBuffer("select  new Licitacao(licitacaoId,numeroInstrumentoConvocatorio,anoInstrumentoConvocatorio,objeto,valorDespesa,modalidadeLicitacao) from Licitacao l where 1=1 ");

		if(orgao!= null){
			hql.append("and l.orgao.orgaoId =:orgaoId  ");
			params.put("orgaoId",orgao.getOrgaoId()); 	 

		}

		if(status!= null){
			hql.append("and l.status.statusId =:statusId  ");
			params.put("statusId",status.getStatusId()); 	

		}

		if(tipoLicitacao!=null && tipoLicitacao.getTipoLicitacaoId()!=null){
			hql.append("and l.tipoLicitacao.tipoLicitacaoId =:tipoLicitacaoId  ");
			params.put("tipoLicitacaoId",tipoLicitacao.getTipoLicitacaoId());   
		}

		if(modalidadeLicitacao!=null && modalidadeLicitacao.getModalidadeLicitacaoId()!=null){
			hql.append("and l.modalidadeLicitacao.modalidadeLicitacaoId =:modalidadeLicitacaoId  ");
			params.put("modalidadeLicitacaoId",modalidadeLicitacao.getModalidadeLicitacaoId());   
		}

		if(objeto!=null && !objeto.equals("")){
			hql.append("and upper(l.objeto) like :obj  ");
			params.put("obj","%"+objeto.toUpperCase()+"%");   
		}

		hql.append(" order by l.numeroProcesso desc,l.anoProcesso desc");

		Query q = em.createQuery(hql.toString());
		for (Entry<String, Object> param : params.entrySet()) {
			q.setParameter(param.getKey(),param.getValue());
		}
		licitacoes = q.getResultList();

		return licitacoes;
	}
}

Eu faria uma LicitacaoService, e colocaria a chamada das outras services(modalidades,etc) dentro da licitacao service… algo assim…

licitacao.setModalidades(modalidadeService.getModalidadesByLicitacao(licitacao));