Combos Aninhados - Valores se perdem no ManagedBean

Boa noite pessoal. Estou tentando utilizar combos aninhados para selecionar estado e cidade.

Abaixo segue trecho do XHTML onde esta sendo chamado os métodos:

  <h:outputLabel value="Estado:"/>
                        <h:selectOneMenu 
                            id="itSigufs" 
                            value="#{empresaMB.filtroEstado}"
                            converter="#{estadoConverter}">
                            <f:selectItem itemLabel="Estados" />
                            <f:selectItems value="#{estadoMB.estados}" 
                                           var="i" itemValue="#{i}" itemLabel="#{i.toString()}"/>
                            <p:ajax process="@this" event="change" update="fmCadEmpresa:itCodcid,:growl"/>
                        </h:selectOneMenu>

                        <h:outputLabel value="Cidade:"/>
                        <h:selectOneMenu 
                            id="itCodcid" 
                            value="#{empresaMB.filtroCidade.codcid}" 
                            converter="#{cidadeConverter}" >
                            <f:selectItem itemLabel="Cidades" />
                            <f:selectItems value="#{cidadeMB.filtrarCidadePorEstado( empresaMB.filtroEstado ) }"
                                           var="i" itemValue="#{i}" itemLabel="#{i.nomcid}"/>
                            <p:ajax process="@this" event="change"/>
                            
                        </h:selectOneMenu>                        

No meu MB tenho o seguinte:

@ManagedBean(name = "empresaMB")
@SessionScoped
public class EmpresaMB implements Serializable {

    public void setSelectedEmpresa(E030emp selectedEmpresa) {
        this.selectedEmpresa = selectedEmpresa;
    }
    private E030emp current;
    private GenericDAO banco;
    private boolean editando;
    
    protected E008ufs filtroEstado;
    protected E008cid filtroCidade;
    
 public EmpresaMB() {
        current = new E030emp();
        banco = GenericDAO.getInstance();
        editando = false;
    }
    private E030emp selectedEmpresa;

    public E030emp getSelectedEmpresa() {
        return selectedEmpresa;
    }

    public E008ufs getFiltroEstado() {
        return filtroEstado;
    }

    public void setFiltroEstado(E008ufs filtroEstado) {
        this.filtroEstado = filtroEstado;
    }

    public E008cid getFiltroCidade() {
        return filtroCidade;
    }

    public void setFiltroCidade(E008cid filtroCidade) {
        this.filtroCidade = filtroCidade;
    }

Os convertes de estado e cidade:
estadoConverter

@Named(value = "estadoConverter")//Somente ManagedBeans podem utilizar injeção de dependência
@RequestScoped//Um converter não precisa ser mantido na sessão
@FacesConverter(value = "estadoConverter")
public class EstadoConverter implements Converter {

  //@EJB//Para injetar um EJB, o converter deve ser um ManagedBean
  //private GenericDAO banco;

  @Override
  public Object getAsObject(FacesContext context, UIComponent component, String value) {
    try {
        GenericDAO banco = new GenericDAO();
        E008ufs objeto = (E008ufs) banco.getObjeto("SELECT C FROM E008ufs C WHERE C.sigufs = ?1", value);
        return objeto;
      
    } catch (Throwable t) {
        t.printStackTrace();
    }
    return null;
  }

  @Override
  public String getAsString(FacesContext context, UIComponent component, Object value) {
    try {
      if (value != null && value instanceof E008ufs) {
        E008ufs entity = (E008ufs) value;
        return entity.getSigufs();
      }
    } catch (Throwable t) {
        t.printStackTrace();
    }
    return null;
  }
}
 

cidadeConverter

@Named(value = "cidadeConverter")//Somente ManagedBeans podem utilizar injeção de dependência
@RequestScoped//Um converter não precisa ser mantido na sessão
@FacesConverter(value = "cidadeConverter")
public class CidadeConverter implements Converter {

 // @EJB//Para injetar um EJB, o converter deve ser um ManagedBean
  //private GenericDAO banco;

  @Override
  public Object getAsObject(FacesContext context, UIComponent component, String value) {
    try {
        GenericDAO banco = new GenericDAO();  
        //E008ufs ufsCid = new E008ufs();
        
        E008cid objeto = (E008cid) banco.getObjeto("SELECT C FROM E008cid C WHERE C.codcid = ?1", value);
        
        //ufsCid.set
        return objeto;
      
    } catch (Throwable t) {
        t.printStackTrace();
    }
    return null;
  }

  @Override
  public String getAsString(FacesContext context, UIComponent component, Object value) {
    try {
      if (value != null && value instanceof E008cid) {
        E008cid entity = (E008cid) value;
        return entity.getCodcid();
      }
    } catch (Throwable t) {
        t.printStackTrace();        
    }
    return null;
  }
}

GenericDAO


import java.util.HashMap;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.FlushModeType;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

public class GenericDAO {

    private static GenericDAO instance = null;
    private EntityManager em;
    private EntityTransaction tx;

    public GenericDAO() {
        try {
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("hibernate.connection.username", "postgres");
            map.put("hibernate.connection.driver_class", "org.postgresql.Driver");
            map.put("hibernate.connection.password", "root");
            map.put("hibernate.connection.url", "jdbc:postgresql://localhost:5432/SHD2012");
//            map.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
           
            map.put("hibernate.connection.lc_ctype", "UTF8");
            //map.put("hibernateshow_sql", "true");
            map.put("hibernate.cache.provider_class", "org.hibernate.cache.NoCacheProvider");
            
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("SHD2012PU", map);
            em = emf.createEntityManager();
            em.setFlushMode(FlushModeType.AUTO);

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static GenericDAO getInstance() {
        if (instance == null) {
            instance = new GenericDAO();
        }
        return instance;
    }

    public <T> List<T> getList(Class clazz, String query, Object... params) {
        try {
            Query q = null;
            q = em.createQuery(query);
            if (params != null) {
                int i = 1;
                for (Object obj : params) {
                    q.setParameter(i, obj);
                    i++;
                }
            }
            return q.getResultList();
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    public Object getObjeto(String query, Object... params) {
        try {
            Query q = null;
            q = em.createQuery(query);
            if (params != null) {
                int i = 1;
                for (Object obj : params) {
                    q.setParameter(i, obj);
                    i++;
                }
            }
            return q.getSingleResult();
        } catch (NoResultException e) {
            System.out.println("não encontrada");
            return null;
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            return null;
        }
    }

    public boolean remove(Object obj) {
        try {
            em.remove(obj);
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
    }
    
    public void startTransaction() {
        tx = em.getTransaction();
        if (tx.isActive() && tx.getRollbackOnly()) {
            tx.rollback();
        }
        if (!tx.isActive()) {
            tx.begin();
        }
        if (!em.getTransaction().isActive()) {
            em.getTransaction().begin();
        }
    }

    public void commit() {
       // startTransaction();
        if (tx != null && tx.isActive()) {
            try {
                tx.commit();
            } catch (Exception cex) {
                try {
                    cex.printStackTrace();
                    tx.rollback();
                } catch (Exception rex) {
                    System.out.println("Erro RollBack ");
                    rex.printStackTrace();
                }
                throw new RuntimeException("Erro gravando alterações no Banco de Dados.");
            }
        }
    }
    
    public void delete(Object obj){
//        tx = em.getTransaction();
//        tx.begin();
        Object merged = em.merge(obj);
        em.remove(merged);
//        tx.commit();
//        em.close();
    }
    
    
    public void rollback() {
        if (tx != null && tx.isActive()) {
            try {
                tx.rollback();
            } catch (Exception rex) {
                rex.printStackTrace();
            }
        }
    }

    public Object persist(Object obj) {
  //      startTransaction();
        try {
            Object novo = em.merge(obj);
            obj = novo;
        } catch (Exception ex) {
            try {
                em.persist(obj);
            } catch (Exception pex) {
                rollback();
                pex.printStackTrace();
                return null;
            }
        }
        return obj;
    }

    public <T> T getEntity(Class<T> clazz, Object key) {
        try {
            return em.find(clazz, key);
        } catch (Exception ex) {
            System.out.println("Erro buscando entidade: " + ex.getMessage());
            return null;
        }
    }

    public void closeEM() {
        if (em != null) {
            em.close();
            em = null;
            instance = null;
        }
    }

    public Object getObject(String consulta) {
        try {
            Object ob = null;
            return em.createQuery(consulta).getSingleResult();
        } catch (NoResultException no) {
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public List getObjects(String consulta, Class clazz) {
        try {
            Object ob = null;
            return em.createNativeQuery(consulta, clazz).getResultList();
        } catch (NoResultException no) {
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public void refresh(Object obj) {
        em.refresh(obj);
    }

    public void clear() {
        em.clear();
    }
}

Consigo selecionar o estado e, em seguida, é carregado o combo das cidades que pertencem ao estado selecionado. Porém, ao tentar salvar o registro, é chamado novamente os métodos e os valores são retornados como NULL para as variáveis filtroEstado e filtroCidade. Aparecendo a seguinte mensagem: fmCadEmpresa:itCodcid: Erro de validação: o valor não é válido.

O que pode estar acontecendo? Como resolver esta situação?