Como fazer SelectOneMenu primefaces com dados do bd Postgres no Eclipse EE e TomCat

Olá, estou aprendendo a usar o eclipse EE com primefaces e TomCat, mas não consigo de jeito nenhum carregar para o select one menu o estado e em consequência do estado, a cidade de um endereço de um atleta(pessoa). É um sistema um pouco complexo que tentei fazer mesmo estando começando, e acho que por isso estou tendo dificuldades, já tentei usar converter, mas não carrega de jeito nenhum, vi algumas soluções usando o HibernateUtil, mas não aprendi a mexer com isso. Vou deixar os codigos, e o SQL do banco, se alguém tiver pelo menos um caminho pra resolver essa questão, já vai ajudar muitooo.

Obs: Todas as classes tem um DAO com inserir/Alterar/Excluir/listartodos/BuscarPorID e outros adicionais, se for necessário eu posto. Tiver que cortar algumas declarações e gets e sets, mas acho que dá pra entender rs qualquer coisa é só falar que eu posto.

Atleta:

public class Atleta {

private int id;
private String nomecompleto;
private int cpf;
private Date dtnascimento;
private Endereco endereco;

}

Endereco:

    public class Endereco {

private int id;
private String descricao;
private String rua;
private int numero;
private String complemento;
private Estado estado;
private Cidade cidade;
private int cep;
}

Estado:

public class Estado {

private int id;
private String uf;
private List cidades;
}

Cidade:

public class Cidade {

private int id;
private String nome;
private Estado estado;
}

FabricaConexao:

package dao;
import java.sql.Connection; import java.sql.DriverManager;

public class FabricaConexao { private Connection conexao;

private String url = “jdbc:postgresql://localhost:5432/CBJ”;
private String user = “postgres”;
private String pass = “postgres”;

public Connection fazerConexao() {

try {
    Class.forName("org.postgresql.Driver");
    this.conexao = DriverManager.getConnection(url, user, pass);
} catch (Exception e) {
    e.printStackTrace();
}
return this.conexao;

}

public void fecharConexao() {
try {
this.conexao.close();

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

}

AtletaBean:

@ ManagedBean @ ViewScoped public class AtletaBean {

@ PostConstruct
public void init() {

try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    AtletaDao dao = new AtletaDao(conexao);
    EnderecoDao daoEnd = new EnderecoDao(conexao);

    this.listaAtletas = dao.listartodos();
    this.listaEnderecos = daoEnd.listartodos();

    this.atletas = new ListDataModel<Atleta>(this.listaAtletas);
    this.enderecos = new ListDataModel <Endereco>(this.listaEnderecos);


    fc.fecharConexao();

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

}

public void PrepararNovo() {
try {

    this.atleta = new Atleta();
    this.endereco = new Endereco();

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

}

public void CadastrarAtleta() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    AtletaDao dao = new AtletaDao(conexao);
    EnderecoDao daoEnd = new EnderecoDao(conexao);

    daoEnd.inserir(this.atleta.getEndereco());

    dao.inserir(this.atleta);


    this.listaAtletas = dao.listartodos();
    this.listaEnderecos = daoEnd.listartodos();

    this.atletas = new ListDataModel<Atleta>(this.listaAtletas);
    this.enderecos = new ListDataModel<Endereco>(this.listaEnderecos);

    fc.fecharConexao();

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

}

public void PrepararExcluir() {
try {
this.atleta = atletas.getRowData();
} catch (Exception e) {
e.printStackTrace();
}
}

public void ExcluirAtleta() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    AtletaDao dao = new AtletaDao(conexao);
    EnderecoDao daoEnd = new EnderecoDao(conexao);

    Endereco EndAqui = this.atleta.getEndereco();
    daoEnd.deletar(EndAqui.getId());

    dao.deletar(this.atleta.getId());


    this.listaAtletas = dao.listartodos();
    this.listaEnderecos = daoEnd.listartodos();

    this.atletas = new ListDataModel<Atleta>(this.listaAtletas);
    this.enderecos = new ListDataModel<Endereco>(this.listaEnderecos);


    fc.fecharConexao();

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

}

public void PrepararEditar() {
try {
this.atleta = atletas.getRowData();
} catch (Exception e) {
e.printStackTrace();
}
}

public void EditarAtleta() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    AtletaDao dao = new AtletaDao(conexao);
    EnderecoDao daoEnd = new EnderecoDao(conexao);


    dao.alterar(this.atleta);
    daoEnd.alterar(this.atleta.getEndereco());


    this.listaAtletas = dao.listartodos();
    this.listaEnderecos = daoEnd.listartodos();

    this.atletas = new ListDataModel<Atleta>(this.listaAtletas);
    this.enderecos = new ListDataModel<Endereco>(this.listaEnderecos);


    fc.fecharConexao();

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

}

EnderecoBean:

@ ManagedBean @ ViewScoped public class EnderecoBean {

@ PostConstruct
public void init() {

try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    EnderecoDao dao = new EnderecoDao(conexao);
    EstadoDao daoEst = new EstadoDao(conexao);
    CidadeDao daoCid = new CidadeDao(conexao);

    this.listaEnderecos = dao.listartodos();
    this.listaEstados = daoEst.listartodos();
    this.listaCidades = daoCid.listartodos();


    this.enderecos = new ListDataModel<Endereco>(this.listaEnderecos);          
    this.estados = new ListDataModel<Estado>(this.listaEstados);
    this.cidades = new ListDataModel<Cidade>(this.listaCidades);

    fc.fecharConexao();

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

}

public void PrepararNovo() {
try {

    this.endereco = new Endereco();


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

}

public void CadastrarEndereco() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    EnderecoDao dao = new EnderecoDao(conexao);

    dao.inserir(this.endereco);


    this.listaEnderecos = dao.listartodos();

    this.enderecos = new ListDataModel<Endereco>(this.listaEnderecos);

    fc.fecharConexao();

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

}

public void PrepararExcluir() {
try {
this.endereco = enderecos.getRowData();
} catch (Exception e) {
e.printStackTrace();
}
}

public void ExcluirEndereco() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    EnderecoDao dao = new EnderecoDao(conexao);



    dao.deletar(this.endereco.getId());


    this.listaEnderecos = dao.listartodos();

    this.enderecos = new ListDataModel<Endereco>(this.listaEnderecos);


    fc.fecharConexao();

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

}

public void PrepararEditar() {
try {
this.endereco = enderecos.getRowData();
} catch (Exception e) {
e.printStackTrace();
}
}

public void EditarEndereco() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    EnderecoDao dao = new EnderecoDao(conexao);


    dao.alterar(this.endereco);


    this.listaEnderecos = dao.listartodos();

    this.enderecos = new ListDataModel<Endereco>(this.listaEnderecos);


    fc.fecharConexao();

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

}

EstadoBean:

@ PostConstruct
public void init() {

try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    EstadoDao dao = new EstadoDao(conexao);
    CidadeDao daoCid = new CidadeDao(conexao);


    this.listaEstados = dao.listartodos();
    this.listaCidades = daoCid.listartodos();



    this.estados = new ListDataModel<Estado>(this.listaEstados);
    this.cidades = new ListDataModel<Cidade>(this.listaCidades);

    fc.fecharConexao();

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

}

public void PrepararNovo() {
try {

    this.estado = new Estado();

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

}

public void CadastrarEstado() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    EstadoDao dao = new EstadoDao(conexao);

    dao.inserir(this.estado);


    this.listaEstados = dao.listartodos();

    this.estados = new ListDataModel<Estado>(this.listaEstados);

    fc.fecharConexao();

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

}

public void PrepararExcluir() {
try {
this.estado = estados.getRowData();
} catch (Exception e) {
e.printStackTrace();
}
}

public void ExcluirEstado() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    EstadoDao dao = new EstadoDao(conexao);



    dao.deletar(this.estado.getId());


    this.listaEstados = dao.listartodos();

    this.estados = new ListDataModel<Estado>(this.listaEstados);


    fc.fecharConexao();

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

}

public void PrepararEditar() {
try {
this.estado = estados.getRowData();
} catch (Exception e) {
e.printStackTrace();
}
}

public void EditarEstado() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    EstadoDao dao = new EstadoDao(conexao);


    dao.alterar(this.estado);


    this.listaEstados = dao.listartodos();

    this.estados = new ListDataModel<Estado>(this.listaEstados);


    fc.fecharConexao();

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

}
public void CidadeDoEstado() { try {

    this.estado = estados.getRowData();


    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    CidadeDao daoCid = new CidadeDao(conexao);



    this.listaCidades = daoCid.cidadesDoEstado(this.estado.getId());


    this.cidades = new ListDataModel<Cidade>(this.listaCidades);


    fc.fecharConexao();

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

}

CidadeBean:

public class CidadeBean {

@ PostConstruct
public void init() {

try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    CidadeDao dao = new CidadeDao(conexao);
    EstadoDao daoEst = new EstadoDao(conexao);


    this.listaCidades = dao.listartodos();
    this.listaEstados = daoEst.listartodos();



    this.cidades = new ListDataModel<Cidade>(this.listaCidades);
    this.estados = new ListDataModel<Estado>(this.listaEstados);

    fc.fecharConexao();

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

}

public void PrepararNovo() {
try {

    this.cidade = new Cidade();

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

}

public void CadastrarCidade() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    CidadeDao dao = new CidadeDao(conexao);

    dao.inserir(this.cidade);


    this.listaCidades = dao.listartodos();

    this.cidades = new ListDataModel<Cidade>(this.listaCidades);

    fc.fecharConexao();

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

}

public void PrepararExcluir() {
try {
this.cidade = cidades.getRowData();
} catch (Exception e) {
e.printStackTrace();
}
}

public void ExcluirCidade() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    CidadeDao dao = new CidadeDao(conexao);



    dao.deletar(this.cidade.getId());


    this.listaCidades = dao.listartodos();

    this.cidades = new ListDataModel<Cidade>(this.listaCidades);


    fc.fecharConexao();

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

}

public void PrepararEditar() {
try {
this.cidade = cidades.getRowData();
} catch (Exception e) {
e.printStackTrace();
}
}

public void EditarCidade() {
try {

    FabricaConexao fc = new FabricaConexao();

    Connection conexao = fc.fazerConexao();

    CidadeDao dao = new CidadeDao(conexao);


    dao.alterar(this.cidade);


    this.listaCidades = dao.listartodos();

    this.cidades = new ListDataModel<Cidade>(this.listaCidades);


    fc.fecharConexao();

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

}

EstadoConverter:

@ FacesConverter(value = “converteEstado”, forClass = Estado.class )
public class ConverteEstado implements Converter, Serializable {

private static final long serialVersionUID = 1L;


public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {
    if (value != null && !value.isEmpty()) {
        return (Estado) uiComponent.getAttributes().get(value);
    }
    return null;
}

public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) {
    if (value instanceof Estado) {
        Estado entity= (Estado) value;
        String textoId = Integer.toString(entity.getId());
        if (entity != null && entity instanceof Estado) {
            uiComponent.getAttributes().put(textoId, entity);
            return textoId;
        }
    }
    return "";
}

Dialog de Novo Atleta onde quero usar o selectOneMenu pra cadastrar o Estado e a Cidade do Endereço do Atleta no cadastro_atletas.xhtml:

<p:dialog header=“Novo Atleta” widgetVar=“dlgNovoAtleta” height=“150"
modal=“true” appendTo=” @ (body)"
draggable=“false” resizable=“false” closable=“false” >

    <h:form id="fCadastrar">
        <h:panelGrid id="pgCadastrar" columns="8">

            <p:outputLabel value="Nome Completo:"/>
            <p:inputText id="nomecompleto" value="#{atletaBean.atleta.nomecompleto}"/>

            <p:outputLabel value="CPF:"/>
            <p:inputText id="cpf" value="#{atletaBean.atleta.cpf}"/>


            <p:outputLabel value="Data de Nascimento:"/>
            <p:calendar locale="pt" showButtonPanel="true" navigator="true" value="#{atletaBean.atleta.dtnascimento}"
                id="dtnascimento" showOn="button"></p:calendar>

            <p:outputLabel value="Endereco:"/>
            <p:inputText id="atleta-rua" value="#{atletaBean.atleta.endereco.rua}"/>

            <p:outputLabel value="Numero:"/>
            <p:inputText id="atleta-numero" value="#{atletaBean.atleta.endereco.numero}"/>

            <p:outputLabel value="Complemento:"/>
            <p:inputText id="atleta-complemento" value="#{atletaBean.atleta.endereco.numero}"/>

            <h:outputLabel value="Estado:"></h:outputLabel>
            <p:selectOneMenu value="#{atletaBean.atleta.endereco.estado}" converter="converteEstado">
                  <f:selectItem itemLabel="Selecione um estado" itemValue="null"/>  
                    <f:selectItems value="#{enderecoBean.listaEstados}" var="endereco.estado"  itemLabel="#{endereco.estado.uf}" itemValue="#{endereco.estado}"/>  


            </p:selectOneMenu>

            <h:outputLabel value="Cidade:"></h:outputLabel>
            <p:selectOneMenu value="#{atletaBean.atleta.endereco.cidade}">

                <f:selectItems value="#{enderecoBean.cidades}" var="cidade"
                    itemLabel="#{cidade.nome}" />
            </p:selectOneMenu>

            <p:outputLabel value="CEP:"/>
            <p:inputText id="atleta-cep" value="#{atletaBean.atleta.endereco.cep}"/>



            </h:panelGrid>
            <h:panelGrid columns="2">
            <p:commandButton value="Cadastrar" oncomplete="PF('dlgNovoAtleta').hide();" 
                    actionListener="#{AtletaBean.CadastrarAtleta}" 
                    update=":tblAtletas" />

            <p:commandButton value="Cancelar" onclick="PF('dlgNovoAtleta').hide();" />

        </h:panelGrid>
    </h:form>
</p:dialog>