Listar objetos em uma DataGrid com o Hibernate

[b]Boa tarde a todos!

Estou tentando popular um DataGrid do primeFaces, mas estou muito confuso de como posso proceder.

Sou iniciante no mundo Java EE e pesquisei bastante sobre o assunto, mas não consegui listar os objetos quando uma pessoa clica no botao gravar.

Abaixo segue as classes, caso falte alguma é so pedir![/b]

Parte da Visao:

[code] <h:outputText value=“Endereço:” />
<p:inputText id=“endereco” size=“25” value="#{controleCliente.contato.endereco}" required=“true” requiredMessage=“Campo Endereco Obrigatório” ></p:inputText>

                <h:outputText value="Tel Residencial:" />
                <p:inputText id="telres" size="25" value="#{controleCliente.contato.telres}" required="true" requiredMessage="Campo Telefone Obrigatório"></p:inputText>

                <h:outputText value="Tel Celular:" />
                <p:inputText id="tecel" size="25" value="#{controleCliente.contato.telcel}" required="true" requiredMessage="Campo Celular Obrigatório"></p:inputText>

                <h:outputText value="E-mail:" />
                <p:inputText id="email" size="25" value="#{controleCliente.contato.email}" required="true" requiredMessage="Campo E-mail Obrigatório"></p:inputText>

            </h:panelGrid>

            <h:panelGrid columns="2">
                <p:commandButton value="Gravar"  onclick="confirmation.show()" type="button" ></p:commandButton>
                <p:commandButton value="Limpar" type="reset"></p:commandButton>

                <p:confirmDialog message="Tem certeza que deseja gravar o contato?"  
                                 showEffect="bounce" hideEffect="explode"  
                                 header="Confirmação de Gravação" severity="alert" widgetVar="confirmation">  

                    <p:commandButton value="Sim" update="messages, @form" oncomplete="confirmation.hide()"  
                                     actionListener="#{controleCliente.gravarFormulario}"/>  
                    <p:commandButton value="Não" onclick="confirmation.hide()" type="button" />   

                </p:confirmDialog>

            </h:panelGrid> 

        </p:panel>
    </h:form>

    <h:form>
        <h:panelGrid>
            <p:dataTable id="tdContato"  var="p" rows="10" emptyMessage="Não existem registros!" paginator="true" value="#{controleCliente.listaContatos()}">
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Nome" />
                    </f:facet>
                    <h:outputText value="#{p.nome}"/>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Endereço" />
                    </f:facet>
                    <h:outputText value="#{p.endereco}"/>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Telefone Residencial" />
                    </f:facet>
                    <h:outputText value="#{p.telres}"/>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Telefone Celular" />
                    </f:facet>
                    <h:outputText value="#{p.telcel}"/>
                </p:column>
                <p:column>
                    <f:facet name="header">
                        <h:outputText value="E-mail" />
                    </f:facet>
                    <h:outputText value="#{p.email}"/>
                </p:column>
            </p:dataTable>
        </h:panelGrid>
    </h:form> [/code]


MangedBean:

[code]@ManagedBean
@RequestScoped
public class ControleCliente {

private Contato contato;
private List<Contato> contatos = new ArrayList<Contato>();

public ControleCliente() {
    this.contato = new Contato();
}

public String init() {

    Contato contato = new Contato();

    return "index.xhtml";
}

public void gravarFormulario(ActionEvent actionEvent) {
    ContatoHelper grvcontato = new ContatoHelper();

    grvcontato.gravarContato(contato);

    contato = new Contato();

    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Obrigado Pela Colaboração!", "Erro, tente de novo!");

    FacesContext.getCurrentInstance().addMessage(null, message);
}

public List<Contato> listaContatos() {

    Iterator it = contatos.iterator();

    while (it.hasNext()) {
        Contato c = (Contato) it.next();
    }
    return contatos;
}

public Contato getContato() {
    return contato;
}

public void setContato(Contato contato) {
    this.contato = contato;
}


O Helper:

[code]public class ContatoHelper {

Session session = null;
Transaction tx = null;
Contato contato;

public ContatoHelper() {
    this.session = HibernateUtil.getSessionFactory().openSession();
}

public void gravarContato(Contato contato) {

    try {

        tx = session.getTransaction();
        tx.begin();
        session.save(contato);
        session.flush();
        tx.commit();

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

    } finally {
        session.close();
    }
}

}[/code]

[b]Pessoal,

não sei o que falta fazer, na verdade devo estar fazendo um confusão danada.

Peço a ajuda e compreesao de todos

Obrigado[/b]

Não entendi o que você quer.

Você quer que após clicar no botão gravar seja exibida uma lista com tudo que já foi gravado?

É isso?

[b][b]Isso!

Na verdade a pessoa vai preencher o formulario e quando clicar em gravar vai popular a grid com os respectivos dados.[/b]

Acho que o Interator não tem nada a ver né?

Obrigado.[/b]

Você está tendo alguma mensagem de erro no console?

[b]Não me aparece nenhuma mensagem de erro!

Apenas mostra que fui gravado com sucesso o contato no banco.[/b]

Os dados estão sendo gravados no banco de dados?

Se sim… É mano, depois de gravar, você teria que navegar para a página que mostra sua lista. Com isso ela iria carregar. Na minha assinatura tem um exemplo de JSF onde mostra navegação.

Pelo visto, é o q te falta fazer.

Entao jakefrog Abaixo esta a sreen do aplicativo:

http://imageshack.us/f/59/screendoapp2.png/

Repare que nao e preciso navegar ate a pagina. Apenas carregar na Grid abaixo do botao.

Teve um amigo que disse pra usar interator outro o List, mas acho que nao esta dando certo o modo como eu estou fazendo.

A tá, entendi.

Então o que você precisa é de um Ajax! \o/

repare que no seu botão tem uma opção chamada update, coloque essa opção no botão de cadastrar apontando para o id da sua datatable. veja se ação de listar todo será achamada após você cadastrar! [=

[b]Cara,

fiz do jeitinho que vc falo e até concordo, mas não deu certo ainda.

Será que a parte colocar os objetos na Grid está certa?[/b]

[code] public List listaContatos() {

    Iterator it = contatos.iterator();  

    while (it.hasNext()) {  
        Contato c = (Contato) it.next();  
    }  
    return contatos;  
} [/code] 

Obrigado pela ajuda!!!

Eita, só agora que eu reparei. Não está não.

Você aí vai ter que fazer um busca no banco de dados uai! =D

vc pode fazer tipo assim:

public List<Contato> listaContatos() { return contatodsDAO.getAllContatos(); }

E no metodo getAllContatos você pega as pessoas por um select! =D

[b]Entao,

estava quebrando a cabeça aqui e fiz deste modo:

A minha classe Helper:[/b]

[code]public class ContatoHelper {

Session session = null;
Transaction tx = null;
Contato contato;

public ContatoHelper() {
    this.session = HibernateUtil.getSessionFactory().openSession();
}

public void gravarContato(Contato contato) {

    try {

        tx = session.beginTransaction();
        session.save(contato);
        tx.commit();

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

    } finally {
        session.close();
    }
}

public List listarContatos() {//Criei este metodo para retornar os registros do banco!

    tx = session.beginTransaction();
    List lista = session.createQuery("from Livro").list();
    tx.commit();
    return lista;

}

}[/code]

O problema e o MangedBean charmar o metodo na classe Helper e passar para o DataGrid. Fiz assim:

[code] public DataModel listar() { //Aqui esta minha duvida!

    List<Contato> lista = new ContatoHelper().listarContatos();
    data = new ListDataModel(lista);
    return data;
}

public Contato getContato() {

    return contato;
}

public void setContato(Contato contato) {
    this.contato = contato;
}

}
[/code]
[b]
Qual sera a encrenca?

Obrigado![/b]

O dataTable aceita uma lista direto. Faça com que seu método listar retorne uma lista de livro, mas faça usando tipagem List.

E pronto, aí no seu datatable coloque ligando direto no método.

[b]jakefrog,

peço desculpas pela demora, mas estava curtindo um pouco o feriado!

Cara, acabei não entendendo o que voce me explico na resposta acim.

Será que voce pode ilustrar um exemplo para mim visualizar o que eu devo fazer?

Obrigado.[/b]

mais ou menos assim:

e o método seria:

public List<Contato> getListaContatos(){ return seus dados }

[b]jakefrog,

finalmente deu certo!

Muito obrigado pela ajuda!

Acabou ficando assim:[/b]

[code] public List listarContatos() {//Meu DAO

    tx = session.beginTransaction();
    List lista = session.createQuery("from Contato").list();
    tx.commit();
    return lista;

}[/code]

[code]
public List listar() {//No MangedBean

    List<Contato> lista = new ContatoHelper().listarContatos();
    return lista;
}[/code]