Mais um problema com primefaces e ajax

Bem, estou com mais um problema com componentes PrimeFaces e requisição ajax.
O cenário é bem conhecido…Toda vez que eu seleciono um estado, o sistema executa um método e carrega as cidades do estado em um componente de seleção.
O problema é o seguinte…se eu tentar gravar os dados do formulário e algum erro de validação acontecer, como por exemplo: “Informe o número do documento”, sempre que eu altero o estado, o método definido no ajax não dispara e o componente de cidade some da tela… oc que pode estar acontecendo? Requisições ajax são muito importantes para o desenvolvimento do meu sistema…

Tela:

<ui:composition template="/template/admintemplate.xhtml">
	<ui:define name="conteudo">
			   		
		<p:panel header="Cadastro de Administrador">
			
			<h:outputScript library="scripts" name="somentenumeros.js" />
			
			<h:form id="cadastro">
				
				<h:inputHidden id="adminid" value="#{adminBean.administrador.id}"/>
				<h:inputHidden id="pessoaid" value="#{adminBean.administrador.pessoa.id}"/>
				
				<p:messages id="mensagens" showDetail="false" autoUpdate="true" closable="true"/>
				
				<h:panelGrid columns="2">
					
					<h:outputLabel value="Documento *" for="documento"/>
					<p:inputText id="documento" value="#{adminBean.administrador.pessoa.documento}"
						size="14" maxlength="14" required="true" requiredMessage="Informe o número do documento"
						onkeypress="return somenteNumero(event);">
						<f:validator validatorId="documentoValidator"/>
						<p:ajax event="change" update="pessoaid, nome, logradouro, numero, complemento, bairro, pngestado, 
							pngcidade, cep, telefone1, telefone2, email"
							listener="#{adminBean.carregarDadosPessoa}"></p:ajax>
					</p:inputText> 										

					<h:outputLabel value="Nome *" for="nome"/>
					<p:inputText id="nome" value="#{adminBean.administrador.pessoa.nome}"
						size="100" maxlength="100" required="true" requiredMessage="Informe o nome">
					</p:inputText>
					  
					<h:outputLabel value="Logradouro *" for="logradouro"/>
					<p:inputText id="logradouro" value="#{adminBean.administrador.pessoa.logradouro}"
						size="100" maxlength="100" required="true" requiredMessage="Informe o logradouro">
					</p:inputText>
					
					<h:outputLabel value="Número" for="numero"/>
					<p:inputText id="numero" value="#{adminBean.administrador.pessoa.numero}"
						size="20" maxlength="20" required="false">
					</p:inputText>
					
					<h:outputLabel value="Complemento" for="complemento"/>
					<p:inputText id="complemento" value="#{adminBean.administrador.pessoa.complemento}"
						size="20" maxlength="20" required="false">
					</p:inputText>

					<h:outputLabel value="Estado *" for="estado"/>
					<h:panelGroup id="pngestado">
						<p:selectOneMenu id="estado"						 
							value="#{adminBean.estadoSelecionado}" 
							converter="estadoConverter" 
							effect="fade" style="width:160px"
							required="true" requiredMessage="Selecione um estado">  						
							<f:selectItem itemLabel="Selecione um estado" itemValue="" />  
							<f:selectItems value="#{adminBean.estadosCadastrados}" var="estado" 
								itemLabel="#{estado.nome}" itemValue="#{estado}"/>  						
							<p:ajax event="change" listener="#{adminBean.carregarCidades}"  update="pngcidade"/>												
						</p:selectOneMenu>
					</h:panelGroup>																																 

					<h:outputLabel value="Cidade *" for="cidade"/>
					<h:panelGroup id="pngcidade">
						<p:selectOneMenu id="cidade" 
							value="#{adminBean.cidadeSelecionada}" 
							converter="cidadeConverter" 
							effect="fade" style="width:160px"
							required="true" requiredMessage="Selecione uma cidade">  						
							<f:selectItem itemLabel="Selecione uma cidade" itemValue="" />  
							<f:selectItems value="#{adminBean.cidades}" var="cidade" itemLabel="#{cidade.nome}" itemValue="#{cidade}"/>						  												  					
						</p:selectOneMenu>
					</h:panelGroup>													
					
					<h:outputLabel value="Bairro *" for="bairro"/>
					<p:inputText id="bairro" value="#{adminBean.administrador.pessoa.bairro}"
						size="50" maxlength="50" required="true" requiredMessage="Informe o bairro">
					</p:inputText>					
							
					<h:outputLabel value="CEP" for="cep"/>
					<p:inputMask id="cep" value="#{adminBean.administrador.pessoa.cep}" 
						mask="99999-999" converter="cepConverter"
						validatorMessage="Informe um CEP válido">
					</p:inputMask>  

					<h:outputLabel value="Telefone 1" for="telefone1"/>
					<p:inputMask id="telefone1" value="#{adminBean.administrador.pessoa.telefone1}" 
						mask="(99)9999-9999" 
						converter="telefoneConverter"
						validatorMessage="Telefone 1 inválido">
					</p:inputMask>

					<h:outputLabel value="Telefone 2" for="telefone2"/>
					<p:inputMask id="telefone2" value="#{adminBean.administrador.pessoa.telefone2}" 
						mask="(99)9999-9999" 
						converter="telefoneConverter"
						validatorMessage="Telefone 2 inválido">
					</p:inputMask>

					<h:outputLabel value="Email *" for="email"/>
					<p:inputText id="email" value="#{adminBean.administrador.pessoa.email}"
						maxlength="100" size="100"
						required="true" requiredMessage="Informe o email"
						validatorMessage="Informe um email válido">
					</p:inputText>							
				
					<p:commandButton action="#{adminBean.salvar}" value="Salvar" ajax="false" icon="ui-icon-check" style="margin:0"/>														  
				</h:panelGrid>
												 
			</h:form>
			
		</p:panel>
	</ui:define>
</ui:composition>

ManagedBean:

package skymedic.administrador;

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

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import sistemasas.administrador.Administrador;
import sistemasas.administrador.AdministradorBusiness;
import sistemasas.endereco.Cidade;
import sistemasas.endereco.Estado;
import sistemasas.endereco.ICidadeDAO;
import sistemasas.endereco.IEstadoDAO;
import sistemasas.pessoa.IPessoaDAO;
import sistemasas.pessoa.Pessoa;
import skymedic.endereco.EnderecoFactory;
import skymedic.pessoa.PessoaFactory;
import skymedic.utils.ExibeMensagem;


@ManagedBean(name="adminBean")
@ViewScoped
public class AdministradorBean {

    private final String PAGINA_ADMIN_CADASTRO = "admincadastro";
    private final String PAGINA_ADMIN_EDICAO = "/admin/admincadastro?faces-redirect=true&includeViewParams=true";
    private final String PAGINA_ADMIN_LISTA = "adminlista";       
    
    private Administrador administrador;
    private List<Administrador> administradores;
    private List<Administrador> administradoresConsultados;
    
    private List<Estado> estadosCadastrados;
    private Estado estadoSelecionado;

    private List<Cidade> cidades;    
    private Cidade cidadeSelecionada;

    @PostConstruct
    private void iniciarAdministradorBean() {
	
	this.administrador = AdministradorFactory.criarAdministrador();
	this.administrador.setPessoa(PessoaFactory.criarPessoa());
	
	this.administradores = null;
	
	this.administradoresConsultados = null;
	
	this.estadosCadastrados = null;
	
	this.estadoSelecionado = null;
	
	this.cidades = null;
	
	this.cidadeSelecionada = null;
	
    }
    
    public Administrador getAdministrador() {
	
        return administrador;
        
    }

    public void setAdministrador(Administrador administrador) {
			
        this.administrador = administrador;
        
        configurarEstadoECidadeSelecionado();        
	        
    }
    
    public void configurarEstadoECidadeSelecionado() {
	
	if (administradorPossuiEstado()) {
	    
	    this.estadoSelecionado = this.administrador.getPessoa().getEstado();
	    
	    carregarCidades();
	
	    if (administradorPossuiCidade()) {
		    
		this.cidadeSelecionada = this.administrador.getPessoa().getCidade();
		    
	    }	    
	    
	}	
	
    }    
   
    public List<Administrador> getAdministradoresConsultados() {
	
        return administradoresConsultados;
        
    }

    public void setAdministradoresConsultados(List<Administrador> administradoresConsultados) {
	
        this.administradoresConsultados = administradoresConsultados;
        
    }
       
    public List<Estado> getEstadosCadastrados() {
	
	if (this.estadosCadastrados == null) {
	    
	    IEstadoDAO estadoDAO = EnderecoFactory.criarEstadoDAO();
	    this.estadosCadastrados = estadoDAO.listar();
	    
	}
	
        return estadosCadastrados;
        
    }

    public Estado getEstadoSelecionado() {
	
	if (administradorPossuiEstado()) {
	    
	    this.estadoSelecionado = this.administrador.getPessoa().getEstado();
	    
	}
	
        return estadoSelecionado;
        
    }
    
    private boolean administradorPossuiEstado() {
	
	return (this.administrador.getPessoa().getEstado() != null);
	
    }

    public void setEstadoSelecionado(Estado estadoSelecionado) {
	
        this.estadoSelecionado = estadoSelecionado;
        
    }
        
    public Cidade getCidadeSelecionada() {		
	
	if (administradorPossuiCidade()) {
	    
	    this.cidadeSelecionada = this.administrador.getPessoa().getCidade();
	    
	}
	
        return cidadeSelecionada;
        
    }
    
    public boolean administradorPossuiCidade() {
	
	return (this.administrador.getPessoa().getCidade() != null);
	
    }

    public void setCidadeSelecionada(Cidade cidadeSelecionada) {
	
        this.cidadeSelecionada = cidadeSelecionada;
        
    }

    public List<Cidade> getCidades() {	
	
	if (this.cidades == null) {
	    
	    carregarCidades();
	    
	}
	
        return this.cidades;
        
    }

    public List<Administrador> getListagem() {
	
	if (this.administradores == null) {
	    	    
	    AdministradorBusiness business = AdministradorFactory.criarAdministradorBusiness();
	    
	    this.administradores = business.listar();
	    
	}
	
	return this.administradores;
	
    }
    
    public String novo() {
	
	return PAGINA_ADMIN_CADASTRO;
	
    }
    
    public String editar() {
	
	return PAGINA_ADMIN_EDICAO;
	
    }

    public String salvar() {
	
	try {
	    
	    this.administrador.getPessoa().setEstado(this.estadoSelecionado);
	    this.administrador.getPessoa().setCidade(this.cidadeSelecionada);	    
	    
	    AdministradorBusiness business =  AdministradorFactory.criarAdministradorBusiness();
	    
	    business.salvar(this.administrador);
	
	    iniciarAdministradorBean();
	    
	    ExibeMensagem.exibirMensagemOK("Administrador gravado com sucesso");
	    
	    return PAGINA_ADMIN_LISTA;
	    
	} catch(Exception e) {
	    
	    ExibeMensagem.exibirMensagemErro(e.getMessage().split(System.getProperty("line.separator")));
	    
	}
	
	return null;
	
    }    
    
    public String excluir() {
	
	try {
	    
	    AdministradorBusiness business =  AdministradorFactory.criarAdministradorBusiness();
	    
	    business.excluir(this.administrador);
	    
	    iniciarAdministradorBean();
	    
	    ExibeMensagem.exibirMensagemOK("Administrador excluido com sucesso");
	    
	    return PAGINA_ADMIN_LISTA;
	    
	} catch(Exception e) {
	    
	    ExibeMensagem.exibirMensagemErro(e.getMessage().split(System.getProperty("line.separator")));
	    
	}
	
	return null;
	
    }
       
    public void carregarDadosPessoa() {		
	
	String documento = this.administrador.getPessoa().getDocumento();

	this.estadoSelecionado = null;
	this.cidadeSelecionada = null;
	
	Pessoa pessoa = retornarPessoa(documento);

	if (pessoa != null) {
		
	    this.administrador.setPessoa(pessoa);
	    this.estadoSelecionado = pessoa.getEstado();	    	
	    this.cidadeSelecionada = pessoa.getCidade();
		
	} else {
		
	    iniciarAdministradorBean();
		
	}	
	
	carregarCidades();

    }   
    
    private Pessoa retornarPessoa(String documento) {
	
	if (documento != null && ! "".equals(documento)) {
	    
	    IPessoaDAO pessoaDAO = PessoaFactory.criarPessoaDAO();
	    
	    return pessoaDAO.buscarPeloDocumento(documento);
	    	    
	}
	
	return null;
	
    }
    
    public void carregarCidades() {			
	
	this.cidades = null;
	
	if (this.estadoSelecionado != null) {	    
	    
	    ICidadeDAO cidadeDAO = EnderecoFactory.criarCidadeDAO();
	    this.cidades = cidadeDAO.listar(this.estadoSelecionado);
	    
	} else {
	    
	    this.cidades = new ArrayList<Cidade>();
	    
	}
	
    }
            
}