Grid de combos associativos JSF

Pessoal,

Estou precisando de uma orientação para codificar uma tela que possui uma grid com uma relação entre duas listas de combos associativos. De um lado tenho combo(s) de estado e do outro combo(s) de cidade, para cada estado selecionado devo carregar o combo de cidade carregando todas as cidades para este estado.

Não sei quantos combos de estado terão, preciso setar os ids de estado e cidade de forma que ao salvar possa percorrer esta lista contendo os ids de forma pareada, ou seja.

uf[0] = ‘SP’
cidade[0] = ‘São Paulo’
uf[1] = ‘MG’
cidade[1] = ‘Belo Horizonte’
uf[2] = ‘BA’
cidade[2] = ‘Salvador’

A minha dificuldade é de montar isto na tela, pois eu precisaria associar cada combo com um item desta lista.

Segue abaixo o código da página e a classe associada.

Agradeço a colaboração.
Lembrando a tela está em JSF 1.2 e usando o http://myfaces.apache.org/tomahawk

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:t="http://myfaces.apache.org/tomahawk">

<ui:composition template="/comum/template.jspx">
	<ui:define name="titulo">
	    :: Associação de cidades não encontradas no Sistema SGR.
	</ui:define>
	<ui:define name="conteudo">
	    <f:view>
	       <t:document>
                <t:documentHead>
					<style type="text/css">
						.yearRowStyle {
					        background-color: #A8D1E8;
					        color: green;
					        text-align: center;
					        font-weight: bold;
					        font-style:italic;
						}
						.weekRowStyle {
						 	background-color: #D6EBFC;
						}
						.selectedDayCellStyle {
							background-color: #ECD5D2;
						}
					</style>
		        </t:documentHead>
	        <t:documentBody >

	    	<h:form id="frmListarCidades">
				<table align="center" border="0">
				  <tr>
				    <td align="left">
				    	Pesquisa
				    </td>
				  </tr>
				</table>
	    		<table align="center" border="0" cellpadding="5" cellspacing="0" width="100%">
				  <tr>
				    <td align="center">
				    	<t:dataTable var="cidade" styleClass="tabela" renderedIfEmpty="false"
							headerClass="header_grid" columnClasses="column_grid" rowStyleClass="row_grid" 
							value="#{conhecimentoFaces.cidadesNaoEncontradas}" sortable="true">
							
							<h:column>
		    					<f:facet name="header">
		    						<t:commandSortHeader columnName="sortColumnCidadeIncorreta" arrow="false">
								 		<f:facet name="ascending">
								 			<t:graphicImage url="../imgs/sort_asc.gif" styleClass="sort_button"/>
								 		</f:facet>
								 		<f:facet name="descending">
								 			<t:graphicImage url="../imgs/sort_desc.gif" styleClass="sort_button"/>
								 		</f:facet>
								 		<h:outputLabel value="Cidade Incorreta"/>
		    						</t:commandSortHeader>
		    					</f:facet>
		    					<h:outputText value="#{cidade.nome}"/>
		    				</h:column>
		    				
							<h:column>
		    					<f:facet name="header">
		    						<t:commandSortHeader columnName="sortColumnUF" arrow="false">
								 		<f:facet name="ascending">
								 			<t:graphicImage url="../imgs/sort_asc.gif" styleClass="sort_button"/>
								 		</f:facet>
								 		<f:facet name="descending">
								 			<t:graphicImage url="../imgs/sort_desc.gif" styleClass="sort_button"/>
								 		</f:facet>
								 		<h:outputLabel value="UF"/>
		    						</t:commandSortHeader>
		    					</f:facet>									
								<t:selectOneMenu id="estadosCorretosCombo" forceId="true"
									value="#{conhecimentoFaces.unidadeFederativaModel.sigla}">
									<f:selectItem itemValue="" itemLabel="Selecione um Estado" />
									<f:selectItems value="#{conhecimentoFaces.ufsCorretas}" />
								</t:selectOneMenu>									
		    				</h:column>

							<h:column>
		    					<f:facet name="header">
		    						<t:commandSortHeader columnName="sortColumnCidadeCorreta" arrow="false">
								 		<f:facet name="ascending">
								 			<t:graphicImage url="../imgs/sort_asc.gif" styleClass="sort_button"/>
								 		</f:facet>
								 		<f:facet name="descending">
								 			<t:graphicImage url="../imgs/sort_desc.gif" styleClass="sort_button"/>
								 		</f:facet>
								 		<h:outputLabel value="Cidade Correta"/>
		    						</t:commandSortHeader>
		    					</f:facet>									
								<t:selectOneMenu id="cidadeCorretosCombo" forceId="true"
									value="#{conhecimentoFaces.cidade.nome}">
									<f:selectItem itemValue="" itemLabel="Selecione uma Cidade" />
									<f:selectItems value="#{conhecimentoFaces.cidadesCorretas}" />
								</t:selectOneMenu>									
		    				</h:column>

			    		</t:dataTable>
				    </td>
				  </tr>
				</table>
	    	</h:form>
			</t:documentBody>
			</t:document>	    	
	    </f:view>
	</ui:define>
</ui:composition>
</html>

Classe associada:

public class ConhecimentoFaces {

	private Collection<Cidade> cidadesNaoEncontradas;
	
	private List<SelectItem> ufsCorretas;

	private List<SelectItem> cidadesCorretas;

	private UnidadeFederativa unidadeFederativaModel = new UnidadeFederativa();

	private Cidade cidade = new Cidade();
	
	private CidadeBO cidadeRN;

	public ConhecimentoFaces() throws IndadosAplicacaoException{
		this.carregarUFsCorretas();
		this.carregarCidadesCorretas();
	}

	public Collection<Cidade> getCidadesNaoEncontradas() {
		
		try {
			cidadesNaoEncontradas = DAOFactory.getInstance().getCidadeDAO().getCidadesNaoEncontradasSGR();

		} catch(IndadosAplicacaoException e){
			System.out.println(e.getMessage());
		}

		return cidadesNaoEncontradas;
    }
	
	public void carregarUFsCorretas() throws IndadosAplicacaoException {

		this.cidadeRN = new CidadeBO();
		this.setUfsCorretas(SisFreteUtil.initCombo(this.getCidadeRN().pesquisarUfs(), "sigla", "sigla"));
		
	}

	public void carregarCidadesCorretas() throws IndadosAplicacaoException {

		//this.setCidadesCorretas(SisFreteUtil.initCombo(DAOFactory.getInstance().getCidadeDAO().getAllCidadesSGR(), "nome", "nome"));
		this.setCidadesCorretas(SisFreteUtil.initCombo(new ArrayList<Cidade>(), "nome", "nome"));
		
	}

	public void setCidadesNaoEncontradas(Collection<Cidade> cidadesNaoEncontradas) {
    	this.cidadesNaoEncontradas = cidadesNaoEncontradas;
    }

	public List<SelectItem> getUfsCorretas() throws IndadosAplicacaoException{
    	return ufsCorretas;
    }


	public void setUfsCorretas(List<SelectItem> ufsCorretas) {
    	this.ufsCorretas = ufsCorretas;
    }


	public CidadeBO getCidadeRN() {
    	return cidadeRN;
    }

	public void setCidadeRN(CidadeBO cidadeRN) {
    	this.cidadeRN = cidadeRN;
    }


	public UnidadeFederativa getUnidadeFederativaModel() {
    	return unidadeFederativaModel;
    }

	public void setUnidadeFederativaModel(UnidadeFederativa unidadeFederativaModel) {
    	this.unidadeFederativaModel = unidadeFederativaModel;
    }

	public List<SelectItem> getCidadesCorretas() {
    	return cidadesCorretas;
    }

	public void setCidadesCorretas(List<SelectItem> cidadesCorretas) {
    	this.cidadesCorretas = cidadesCorretas;
    }

	public Cidade getCidade() {
    	return cidade;
    }

	public void setCidade(Cidade cidade) {
    	this.cidade = cidade;
    }
	
}