CRUD JSF 2.0 + Hibernate – Exemplo Gerenciando Livros

Bom dia a todos!

Hoje vou apresentar todos os passos necessários para a construção de um CRUD (Create, Read, Update and Delete) utilizando Java Server Faces 2.0 para facilitar a criação das páginas e a comunicação destas com as classes Java e Hibernate para realizar a persistência dos dados.

Para o desenvolvimento eu utilizei o Netbeans 6.8 que já conta com suporte ao JSF 2.0 e ao Hibernate 3 facilitando o trabalho de baixar os frameworks e coloca-los no projeto, porém, fica a cargo do desenvolvedor escolher a IDE de sua preferência para a criação!

O exemplo para a criação do CRUD será dado através da gerencia de livros, um exemplo simples mas capaz de mostrar como as operações básicas de um sistema podem ser efetuadas com JSF.

A segunda parte deste CRUD com utilização de ajax e da biblioteca de componentes PrimeFaces está disponível aqui!

Pré Requisitos

Netbeans ou Eclipse

JSF 2.0

Hibernate 3

– MySQL

Estrutura do CRUD

O nosso CRUD segue o padrão MVC para programação Web, separando as classes em camadas de acordo com a responsabilidade de cada uma. Abaixo é apresentada a estrutura que criaremos onde Dao, Model, Controller e View serão pacotes do projeto.

Cada livro no CRUD terá as seguintes informações: título, autor, páginas, editora, isbn e avaliação que serão mantidas no banco de dados.

Criando o Banco de Dados…

O CRUD utilizará Banco de Dados MySQL, para isso, crie um squema e uma tabela no seu banco como está descrito abaixo.

Squema


CREATE DATABASE IF NOT EXISTS livraria;

Tabela


CREATE TABLE `livro` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`autor` varchar(255) DEFAULT NULL,
`avaliacao` int(11) NOT NULL,
`editora` varchar(255) DEFAULT NULL,
`isbn` varchar(255) DEFAULT NULL,
`paginas` int(11) NOT NULL,
`titulo` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

Criando as Camadas…

Model

O pacote Model do projeto deve conter uma classe chamada Livro que será um POJO (Plain Old Java Object) com as annotations do hibernate necessárias para utilização do framework. A classe deve ficar de acordo com esta:


package Model;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

/**
*
* @author José Alexandre
*/
@Entity
public class Livro implements Serializable {

@Id
@GeneratedValue
private long id;
private String titulo;
private String autor;
private int paginas;
private String editora;
private String isbn;
private int avaliacao;

public Livro() {
}

public Livro(long id, String titulo, String autor, int paginas, String editora, String isbn, int avaliacao) {
this.id = id;
this.titulo = titulo;
this.autor = autor;
this.paginas = paginas;
this.editora = editora;
this.isbn = isbn;
this.avaliacao = avaliacao;
}

public String getAutor() {
return autor;
}

public void setAutor(String autor) {
this.autor = autor;
}

public int getAvaliacao() {
return avaliacao;
}

public void setAvaliacao(int avaliacao) {
this.avaliacao = avaliacao;
}

public String getEditora() {
return editora;
}

public void setEditora(String editora) {
this.editora = editora;
}

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getIsbn() {
return isbn;
}

public void setIsbn(String isbn) {
this.isbn = isbn;
}

public int getPaginas() {
return paginas;
}

public void setPaginas(int paginas) {
this.paginas = paginas;
}

public String getTitulo() {
return titulo;
}

public void setTitulo(String titulo) {
this.titulo = titulo;
}

}

Dao

O pacote Dao vai realizar a comunicação com o banco utilizando o hibernate para salvar, listar alterar e excluir livros. Dentro deste pacote, deve ser criada uma interface chamada LivroDao, uma classe chamada LivroDaoImp e uma classe chamada HibernateUtil (realizará a conexão com o banco) da mesma forma que estas:

Interface LivroDao


package Dao;

import Model.Livro;
import java.util.List;

/**
*
* @author José Alexandre
*/
public interface LivroDao {

public void save(Livro livro);
public Livro getLivro(long id);
public List<livro> list();
public void remove(Livro livro);
public void update(Livro livro);

}


Classe LivroDaoImp


package Dao;

import Model.Livro;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
*
* @author José Alexandre
*/
public class LivroDaoImp implements LivroDao {

public void save(Livro livro) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
session.save(livro);
t.commit();
}
public Livro getLivro(long id) {
Session session = HibernateUtil.getSessionFactory().openSession();
return (Livro) session.load(Livro.class, id);
}
public List<livro> list() {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
List lista = session.createQuery("from Livro").list();
t.commit();
return lista;
}
public void remove(Livro livro) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
session.delete(livro);
t.commit();
}
public void update(Livro livro) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction t = session.beginTransaction();
session.update(livro);
t.commit();
}
}

Classe HibernateUtil


package Utils;

import Model.Livro;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

/**
* Hibernate Utility class with a convenient method to get Session Factory object.
*
* @author José Alexandre
*/
public class HibernateUtil {

private static SessionFactory sessionFactory;

private HibernateUtil() {
}

public static SessionFactory getSessionFactory() {
if (sessionFactory == null) {
try {
// Create the SessionFactory from standard (hibernate.cfg.xml)
// config file.
AnnotationConfiguration ac = new AnnotationConfiguration();
ac.addAnnotatedClass(Livro.class);
sessionFactory = ac.configure().buildSessionFactory();
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
return sessionFactory;
} else {
return sessionFactory;
}
}

Controller

O pacote Controller vai realizar a comunicação da Camada de Visão representada por nossas páginas JSF com o banco de dados sendo responsável por realizar as operações requisitadas nas páginas JSF e em seguida encaminhar o usuário para uma página. A classe a ser criada deve chamar LivroController e precisa ser escrita dessa forma:


package Controller;

import Dao.LivroDao;
import Dao.LivroDaoImp;
import Model.Livro;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

/**
*
* @author José Alexandre
*/
@ManagedBean
@SessionScoped
public class LivroController {

private Livro livro;
private DataModel listaLivros;

public DataModel getListarLivros() {
List<livro> lista = new LivroDaoImp().list();
listaLivros = new ListDataModel(lista);
return listaLivros;
}
public Livro getLivro() {
return livro;
}
public void setLivro(Livro livro) {
this.livro = livro;
}
public String prepararAdicionarLivro(){
livro = new Livro();
return "gerenciarLivro";
}
public String prepararAlterarLivro(){
livro = (Livro)(listaLivros.getRowData());
return "gerenciarLivro";
}
public String excluirLivro(){
Livro livroTemp = (Livro)(listaLivros.getRowData());
LivroDao dao = new LivroDaoImp();
dao.remove(livroTemp);
return "index";
}
public String adicionarLivro(){
LivroDao dao = new LivroDaoImp();
dao.save(livro);
return "index";
}
public String alterarLivro(){
LivroDao dao = new LivroDaoImp();
dao.update(livro);
return "index";
}
}

View

O pacote View é composto por páginas JSF que irão executar o pedido de listagem, alteração, exclusão e adição de Livros, o nosso projeto precisará de duas páginas JSF uma chamada index.xhtml que listará os Livros do Usuário e permitirá excluí-los e acessar as páginas de alteração e inserção, a segunda página chamada gerenciarLivro.xhtml será criada para realizar a adição e alteração dos livros. As duas páginas se comunicam diretamente com os métodos e atributos da classe LivroController permitindo a interação de forma fácil com o banco de dados. Em seguida são apresentadas as páginas necessárias.

Página index.xhtml


<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Gerenciador de Livros</title>
    </h:head>
    <h:body>
        <h1>Gerenciador de Livros</h1>
        <h:dataTable var="livro" value="#{livroController.listarLivros}">
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Título"/>
                </f:facet>
                <h:outputText value="#{livro.titulo}" />
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Autor"/>
                </f:facet>
                <h:outputText value="#{livro.autor}"/>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Páginas"/>
                </f:facet>
                <h:outputText value="#{livro.paginas}"/>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Editora"/>
                </f:facet>
                <h:outputText value="#{livro.editora}"/>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Isbn"/>
                </f:facet>
                <h:outputText value="#{livro.isbn}"/>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Avaliação"/>
                </f:facet>
                <h:outputText value="#{livro.avaliacao}"/>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Alterar"/>
                </f:facet>
                <h:form>
                    <h:commandButton action="#{livroController.prepararAlterarLivro}" value="Alterar"/>
                    </h:form>
            </h:column>
            <h:column>
                <f:facet name="header">
                    <h:outputText value="Excluir"/>
                </f:facet>
                <h:form>
                    <h:commandButton action="#{livroController.excluirLivro}" value="Excluir"/>
                    </h:form>
            </h:column>
        </h:dataTable>
        <br/>
        <h:form>
            <h:commandLink value="Novo Livro" action="#{livroController.prepararAdicionarLivro}"/>
        </h:form>
    </h:body>
</html>

Página gerenciarLivro.xhtml


<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Gerenciador de Livros</title>
</h:head>
<h:body>
<h1>Gerenciador de Livros</h1>
<h:form>
Título <h:inputText value="#{livroController.livro.titulo}"/><br/>
Autor: <h:inputText value="#{livroController.livro.autor}"/><br/>
Paginas: <h:inputText value="#{livroController.livro.paginas}"/><br/>
Editora: <h:inputText value="#{livroController.livro.editora}"/><br/>
ISBN: <h:inputText value="#{livroController.livro.isbn}"/><br/>
Avaliação: <h:selectOneMenu value="#{livroController.livro.avaliacao}">
<f:selectItem itemLabel="1" itemValue="1"/>
<f:selectItem itemLabel="2" itemValue="2"/>
<f:selectItem itemLabel="3" itemValue="3"/>
<f:selectItem itemLabel="4" itemValue="4"/>
<f:selectItem itemLabel="5" itemValue="5"/>
</h:selectOneMenu><br/>
<h:commandButton action="#{livroController.adicionarLivro}" value="Inserir Novo Livro"/>
<h:commandButton action="#{livroController.alterarLivro}" value="Alterar Livro"/>
<br/>
<h:commandLink action="index" value="Voltar"/>
</h:form>
</h:body>
</html>

Configurações necessárias…

Arquivo web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>

Arquivo hibernate.cfg.xml

Este arquivo configura o hibernate de acordo com seu banco de dados note que é preciso adicionar ainda o seu usuário no banco de dados, sua senha e caso seja necessário o ip e a porta do banco.


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/livraria</property>
<property name="hibernate.connection.username">seuUsuario</property>
<property name="hibernate.connection.password">suaSenha</property>
</session-factory>
</hibernate-configuration>

Essas são as informações necessárias para a criação de um CRUD básico para a gerencia de Livros utilizando JSF 2.0 e Hibernate, neste link segue o projeto criado no Netbeans para download.

Por hoje é só pessoal, qualquer dúvida estou a disposição!

A segunda parte deste CRUD com utilização de ajax e da biblioteca de componentes PrimeFaces está disponível aqui!

Abraços!

José Alexandre Macedo

140 comments for “CRUD JSF 2.0 + Hibernate – Exemplo Gerenciando Livros

  1. Luís Theodoro
    9 de Junho de 2010 at 19:29

    Muito bom tutorial José Alexandre, bem completo e explicado. Seu blog está ficando muito bom.

    • José Alexandre Macedo
      9 de Junho de 2010 at 19:36

      Obrigado Luis Theodoro! Qualquer dúvida estamos ai! Abraços!

      • TIAGO FRANCISCO ANDRADE DIOCESANO _
        14 de Setembro de 2014 at 21:41

        Olá José, tudo bem?
        Gostaria de saber se ao importar o seu projeto no meu netbeans, tem que primeiro configurar o hibernate e o jsf.
        att

      • Paulo
        22 de Outubro de 2014 at 11:12

        Gostaria de saber por que você criou a Dao Interface pois não está sendo utilizada. Na controller você realiza uma instância direta para a Dao Implementation.

        • Matheus Lúcio
          12 de Fevereiro de 2016 at 15:45

          dao imp extende da dao ‘-‘

          • paulo
            12 de Fevereiro de 2016 at 23:06

            e ai não funcionou, quer que eu te mande o projeto????

      • Ragielly Pinheiro
        17 de Abril de 2015 at 12:20

        preciso de uma ajuda
        preciso fazer uma sistema de vendas de passagens aéreas
        tenho algumas duvidas.
        responder e-mai:ragielly.19@gmail.com

  2. Aurélio Mendes
    22 de Junho de 2010 at 22:36

    Valeu cara… tá otimo o tutorial… estava com muitas dúvidas pra relacionar a jsp com a controller… me esclareceu muito… já salvei seu blog nos favoritos vou dar uma conferida nos conteúdos depois.. valeu !

    • José Alexandre Macedo
      23 de Junho de 2010 at 9:21

      Qualquer dúvida estamos aí Aurélio! Valeww pelo feedback!

      • marcio oliveira
        30 de Março de 2015 at 10:23

        Oi josé! É minha primeira vez aqui. Gostaria de saber se vc pode me indicar algum curso onde eu possa desenvolver essas mesmas tecnologias na prática e que seja bem reconhecido. Onde você aprendeu Aguardo resposta, abraço!

  3. 23 de Junho de 2010 at 9:23

    Finalmente um exemplo decente de dataTable utilizando editar e alterar no JSF! Muito bom tutorial. Obrigado, salvou o meu dia!
    Um abraço!

    • José Alexandre Macedo
      23 de Junho de 2010 at 9:40

      Marcelo tive o mesmo problema que o seu quando comecei com jsf também estava muito difícil achar exemplos com dataTable e essa foi uma das motivações pra escrever este post! Qualquer dúvida estou a disposição! Abraços!

  4. Junior Sousa
    27 de Junho de 2010 at 20:49

    Ótimo tutorial. Parabéns.

    • José Alexandre Macedo
      27 de Junho de 2010 at 21:46

      Obrigado Junior!

  5. Everton
    8 de Julho de 2010 at 10:20

    Valew José Alexandre!!… Muito bom turtorial. Estava precisando de um exemplo desses para começar a utilizar JSF e Hibernate.. Valew mesmo. Abs

    • José Alexandre Macedo
      8 de Julho de 2010 at 13:07

      Obrigado Everton!!
      Qualquer dúvida ou sugestão estamos ai!!
      Abraços!

  6. Edson Lopes
    14 de Julho de 2010 at 21:23

    Olá José, eu tenho algumas contribuições a fazer:
    1) A tabela do seu script está com a primeira letra minúscula (“livro”), e o seu exemplo está buscando a tabela “Livro”, o que gera um erro ao executar, pois funciona com Case Sensitive. (para mudar, bastou um ALTER TABLE livro RENAME Livro e tudo voltou a funcionar)
    2) Eu iniciei o projeto primeiramente em Eclipse (Helios), e não consegui colocar para rodar, pois me gera um erro: “java.lang.ClassNotFoundException: com.sun.faces.config.ConfigureListener” (E que até agora não consegui resolver).
    3) Em seu arquivo para download, a pasta Lib possui vários .JARS que não são usados com a implementação do JSF 2, e que deixam o arquivo muito grande para download.
    4) Quando mudei para o Netbeans e importei o seu projeto, tudo funcionou legal – fora o lance do Livro, claro, mas não sei o pq, mas estou tendo este erro direto: “Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure”. Volta e meia, assim que faço qualquer ação no sistema, ele me gera o erro, mas depois tento clicar novamente, e dá certo… Mas gostaria de saber se este problema é de conhecimento seu?
    Bem, fico por aqui, e te dou os parabéns por esta iniciativa.

    • José Alexandre Macedo
      15 de Julho de 2010 at 0:11

      Olá Edson!
      Primeiramente obrigado pelas contribuições!
      Vou comenta-las a seguir:

      (1) Achei estranho não funcionar a busca por “Livro” com maiúsculo porque é uma busca feita com a linguagem do hibernate e não diretamente com código sql… se fosse com código sql concordaria que a busca estava errada… estranho que aqui funcionou…
      (2) Este você conseguiu né! Na verdade eu não cheguei a testar o exemplo no eclipse mas fico feliz de ter conseguido!
      (3) Concordo com você nessa… adicionei as bibliotecas do jsf2 e hibernate pelo netbeans e ele coloca tudo e mais um pouco lá né… cheguei a ver agora se no .war gerado as bibliotecas selecionadas são somente as utilizadas ou todas e me parece que ele coloca todas.. gostaria de saber depois se você sabe alguma forma automática de selecionar apenas as bibliotecas realmente utilizadas…
      (4) Este problema não era de conhecimento meu não… na verdade executei alguns testes e em nenhum dos casos este erro apareceu… precisava dps que você me dissesse o momento especifico que o erro ocorre ou me passasse todo o erro pra dar uma olhada… dei uma pesquisada e em alguns casos este erro era causado por algumas configurações erradas como porta configurada errada… mas não deve ser seu caso…

      Agradeço mais uma vez as contribuições!
      Valeww!

  7. Edson Lopes
    14 de Julho de 2010 at 22:20

    Para o Número 2, eu consegui rodar no Eclipse! 😀
    Tive problemas com o dom4j-1.6.1.jar, mas já foi resolvido.

  8. VSousa
    15 de Julho de 2010 at 0:29

    Sou iniciante em desenvolvimento com Java, JSF e Hibernate. Estou usando este modelo para aprender, mas na hora de rodar o teste, ocorreu o seguinte erro [java.lang.ClassNotFoundException: ] tbm, já coloquei na lib do projeto o dom4j.jar. Gostaria de saber como vc resolveu o problema.
    Grata.

    • José Alexandre Macedo
      15 de Julho de 2010 at 0:39

      VSousa, você está utilizando o Eclipse né?! Vamos ver se o Edson nos informa mais algum detalhe utilizado por ele para execução no eclipse… caso contrário posso tentar, assim q possível, adaptar o exemplo para o eclipse…

      Qualquer outro problema estou a disposição!

      • VSousa
        15 de Julho de 2010 at 10:25

        José Alexandre, se você quiser eu te passo o projeto que fiz no eclipe para você ver..

    • Edson Lopes
      15 de Julho de 2010 at 10:46

      Bem, eu consegui fazer o projeto funcionar no Eclipse blz… Agora sobre o seu erro de [java.lang.ClassNotFoundException], vc tem que mostrar o nome da classe que ele não está encontrando para eu poder te ajudar.
      No mais, vou postar o código do meu projeto no 4Shared em breve para os colegas, ok. (estou no trabalho agora, e está na máquina de casa)

      • José Alexandre Macedo
        15 de Julho de 2010 at 11:38

        Edson, depois nos passe o link então do código no 4shared para disponibiliza-lo para os interessados em rodar no eclipse!

  9. VSousa
    15 de Julho de 2010 at 0:29

    Edson Lopes :Para o Número 2, eu consegui rodar no Eclipse! Tive problemas com o dom4j-1.6.1.jar, mas já foi resolvido.

    Gostaria de saber como você resolveu este problema.

  10. VSousa
    15 de Julho de 2010 at 11:30

    VSousa :José Alexandre, se você quiser eu te passo o projeto que fiz no eclipe para você ver..

    Jose Alexandre, já resolvi o problema…tks.

    • José Alexandre Macedo
      15 de Julho de 2010 at 11:35

      VSousa, caso queira compartilhar como resolveu o problema ou o código para quem for utilizar no eclipse, fique a vontade!

      • VSousa
        15 de Julho de 2010 at 14:20

        Como ainda sou iniciante, meu erro foi não observar a informação completa. Bem, tive que baixar um novo jta.jar e colocar na JDK/JRE/LIB.

  11. 15 de Julho de 2010 at 12:45

    Pessoal, aqui vai os fontes do projeto feito no Eclipse.
    http://www.4shared.com/file/1ct8eBjS/CrudLivros_JSF_HIBERNATE.html

    Eu não alterei nada que o caro amigo José fez em seus códigos originais, apenas coloquei tudo no Eclipse, retirei as Jars que não fazem parte (agora são apenas 15), coloquei para funcionar e ver se dava certo, e postei no 4Shared como havia dito.

    Para os erros que estava dando em meu caso, aqui vão as respostas:

    1) Realmente deu este erro de grafia, pois quando se cria a tabela com aspas, ele respeita a grafia idêntica, e como o Hibernate estava procurando por Livros com o L em maiúsculo devido ao nome do objeto, ele não funcinou logo de cara, então rodei o código “ALTER TABLE livro RENAME Livro e tudo voltou a funcionar.
    2) Quanto a este, eu resolvi colocando as Jars que estão no link informado neste comentário aqui (pasta lib do projeto).
    3) Sobre esta dica, eu retirei alguns Jars e de 22 foi para 15. (Mas não sei como retirar automaticamente os Jars não utilizados no Netbeans.)
    4) Para este erro, eu vi que era problema da internet aqui de casa, que é muito lenta, e o meu banco está online, ou seja, o Hibernate local é muito mais rápida, e não aguenta esperar a resposta do servidor MySQL, então me gera os erros de “Communications link failure”, mas nada grave, é só clicar novamente nas ações que desejar e ele funciona. (Para terminar com isto, o usuário tem que alterar as configurações de “timeout” do web.xml).
    Bem, creio que seja só isto…
    Abração a todos.

  12. 17 de Julho de 2010 at 20:46
  13. Renato Diniz
    5 de Agosto de 2010 at 11:37

    Bem legal. Obrigado.

  14. juniorsatanas
    24 de Agosto de 2010 at 16:28

    Bom perfeito … parabéns ..

    add aqui como favorito.. otimo blog

    666
    juniorsatanas

    • José Alexandre Macedo
      24 de Agosto de 2010 at 16:32

      Obrigado Junior!

  15. MVS
    30 de Agosto de 2010 at 15:29

    Excelente Post. Vai ajudar muito. 😀

    Obrigado.

  16. juniorsatanas
    31 de Agosto de 2010 at 10:15

    Alexandre, seria bom adicionar mais uma classe, autor, fazer um relacionamento OneToMany, adicionar Primefaces + Spring security..O que você acha ?

    SUPER CRUD !

    • José Alexandre Macedo
      31 de Agosto de 2010 at 11:01

      E ai Junior, vou apresentar algumas das suas sugestões nos próximos posts!

      Fique ligado no blog!

      Abraços!

  17. 7 de Setembro de 2010 at 21:33

    Cara ótimo Post, vai me ajudar bastante para inicar com JSF.
    Ocorreu tudo OK, mas estou com 2 probleminha:
    1 – ele não lista os registros salvos no banco;
    2 – quando eu clico em ”Novo Livro” ele me gera um erro: javax.el.PropertyNotFoundException: /index.xhtml @68,99 action=”#{livroController.prepararAdicionarLivro}”: Target Unreachable, identifier ‘livroController’ resolved to null

    Fico no aguardo. e Vleu!!!

    • José Alexandre Macedo
      7 de Setembro de 2010 at 22:44

      E ai André, me diz uma coisa, você colocou o annotation @ManagedBean em cima da classe livroControle?? vc conferiu se está realmente salvando no banco? me responda essas para ter uma ideia melhor ok?! Abraços!

  18. Lucas
    21 de Setembro de 2010 at 11:31

    Excelente POST…
    Executei passo a passo no netbeans, mas quando executo aparece o titulo na tela e não aparece mais nada logo abaixo…e que pode ser?

    Obs: Não aparece nenhuma mensagem de erro nesse processo!

    • 21 de Setembro de 2010 at 11:40

      Olá Lucas,

      Da uma olhada na saída do tomcat do netbeans se não aparece nada… caso apareça ou não me fale dps!

      Abraços,
      José Alexandre

  19. Lucas
    21 de Setembro de 2010 at 14:16

    Opa Alexandre, segue o erro no tomcat!

    21/09/2010 14:12:06 org.apache.catalina.core.StandardContext listenerStart
    SEVERE: Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
    javax.faces.FacesException: Can’t parse configuration file: jndi:/localhost/padraoJSF/WEB-INF/faces-config.xml: Error at line 18 column 25: cvc-complex-type.2.4.a: Invalid content was found starting with element ‘managed-bean-class’. One of ‘{“http://java.sun.com/xml/ns/javaee”:description, “http://java.sun.com/xml/ns/javaee”:display-name, “http://java.sun.com/xml/ns/javaee”:icon, “http://java.sun.com/xml/ns/javaee”:managed-bean-name}’ is expected.
    at com.sun.faces.config.ConfigureListener.parse(ConfigureListener.java:1438)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:376)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:637)
    at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:563)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:498)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
    21/09/2010 14:12:08 org.apache.catalina.core.ApplicationContext log
    INFO: Initializing WebApplicationContext for servlet ‘tradingapp’
    21/09/2010 14:12:08 org.apache.catalina.core.ApplicationContext log
    INFO: ContextListener: contextInitialized()
    21/09/2010 14:12:08 org.apache.catalina.core.ApplicationContext log
    INFO: SessionListener: contextInitialized()

    • 21 de Setembro de 2010 at 14:34

      E ai Lucas,

      você possui um arquivo faces-config.xml no seu projeto?!
      me parece que o erro esta relacionado a ele… se você tiver este arquivo delete ele e tente executar…

  20. Lucas
    21 de Setembro de 2010 at 15:25

    Poise, tirei ele do projeto…
    Mas continua o mesmo problema!

    Parece que não reconhece do para baixo. (index.xhtml)

    • Lucas
      21 de Setembro de 2010 at 15:26

      ” “

  21. Lucas
    21 de Setembro de 2010 at 15:56

    Consegui resolver…
    De alguma forma não estava reconhecendo um jar no projeto!
    Retirei e inseri novamente e funcionou!
    De qualquer forma agradeço José!

  22. Erick Basilio
    22 de Setembro de 2010 at 9:10

    Parabéns pelo excelente tutorial! Estou iniciando no Faces, estava com dúvidas sobre os padrões do JSF 1.2 e 2.0, mas nesse tutorial fica claro as facilidades da nova versão ainda com a ajuda do Primefaces. Obrigado!

  23. Eugênio
    24 de Setembro de 2010 at 21:04

    Primeiramente parabéns, o seu tutorial ta nota 10.
    Agora algumas duvidas aqui de iniciante. O web.xml e o hibernate.cfg.xml ficam dentro do package view?
    O nome do meu Projeto eu fiz como “AdmLivro”
    Pra mim abrir a pagina é no http://localhost:8080/AdmLivro/index.xhtml?
    Se for não estou conseguindo. Se você pudesse tirar um print da estrutura de suas paginas e podesse postar aqui ou me mandar por email eu agradeceria.
    Valeuu

    • 24 de Setembro de 2010 at 22:26

      Olá Eugênio,

      obrigado pelos parabéns…

      O web.xml deve ficar na pasta WEB-INF esta pasta fica na pasta web.
      Já o hibernate.cfg.xml deve ficar na pasta java, a pasta java fica na pasta src.
      Para vc abrir a página depois de executado o tomcat e implantado o projeto vc deve acessar http://localhost:8080/AdmLivro/index.jsf
      se 8080 for a porta onde o tomcat estiver rodando…

      caso não tenha entendido ou não funcione ainda me diga…

      abraços,
      José Alexandre

  24. Eugênio
    26 de Setembro de 2010 at 7:14

    Obrigado pela resposta rápida. Aparentemente ta tudo feito corretamente.
    Mas quando eu tento acessar a pagina da pagina nao encontrada. Estou tentando pelo eclipse. Depois vou tentar no netbeans pra ver se conseguido.

  25. Eugênio
    26 de Setembro de 2010 at 17:43

    Meu tomcat ta assim. To achando que ta faltando alguma lib.

    26/09/2010 17:41:00 org.apache.catalina.core.AprLifecycleListener init
    INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: .:/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java
    26/09/2010 17:41:00 org.apache.tomcat.util.digester.SetPropertiesRule begin
    WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.jst.jee.server:AdmLivros’ did not find a matching property.
    26/09/2010 17:41:01 org.apache.coyote.http11.Http11Protocol init
    INFO: Initializing Coyote HTTP/1.1 on http-8080
    26/09/2010 17:41:01 org.apache.coyote.ajp.AjpProtocol init
    INFO: Initializing Coyote AJP/1.3 on ajp-8009
    26/09/2010 17:41:01 org.apache.catalina.startup.Catalina load
    INFO: Initialization processed in 1376 ms
    26/09/2010 17:41:01 org.apache.catalina.core.StandardService startInternal
    INFO: Starting service Catalina
    26/09/2010 17:41:01 org.apache.catalina.core.StandardEngine startInternal
    INFO: Starting Servlet Engine: Apache Tomcat/7.0.2
    26/09/2010 17:41:03 com.sun.faces.config.ConfigureListener contextInitialized
    INFO: Inicializando Mojarra 2.0.3 (FCS b03) para o contexto ‘/AdmLivros’
    26/09/2010 17:41:05 com.sun.faces.spi.InjectionProviderFactory createInstance
    INFO: JSF1048: Anotações PostConstruct/PreDestroy presentes. Os métodos ManagedBeans marcados com essas anotações informarão as anotações processadas.
    26/09/2010 17:41:06 org.apache.coyote.http11.Http11Protocol start
    INFO: Starting Coyote HTTP/1.1 on http-8080
    26/09/2010 17:41:06 org.apache.coyote.ajp.AjpProtocol start
    INFO: Starting Coyote AJP/1.3 on ajp-8009
    26/09/2010 17:41:06 org.apache.catalina.startup.Catalina start
    INFO: Server startup in 4915 ms

  26. Eugênio
    29 de Setembro de 2010 at 0:31

    Esse problema do tomcat ja resolvi.
    Tem como você disponibilizar as lib que você usou nesse seu exemplo?

    • 29 de Setembro de 2010 at 9:21

      Bom dia Eugênio,

      Você pode baixar o projeto aqui e ir até a pasta build > web > WEB-INF > lib e lá estarão todas as bibliotecas utilizadas!

      Abraços!

  27. Eugênio
    29 de Setembro de 2010 at 19:10

    Deu certo agora, o problema era as lib mesmo.
    Parabéns novamente, vou ficar de olho no blog.
    Gostei do conteudo.

  28. Sérgio Marques
    1 de Outubro de 2010 at 14:15

    Excelente tutorial ! Programava já em Struts com EJB etc e quando fiz esse primeiro em JSF com hibernate eu achei tudo muito mais fácil ! Voce tem algum tutorial com JSF + Hibernate + EJB ???

    • 1 de Outubro de 2010 at 14:22

      Olá Sérgio,

      Por enquanto não… mas é uma ideia para melhorar este!

      Espero q tenha gostado msmo!

      Abraços!

  29. Pedro Henrique Castro
    8 de Outubro de 2010 at 19:51

    Olá José, parabéns pela sua disponibilidade em auxiliar quem está iniciando a desenvolver utilizando essas tecnologias.

    Segui os passos do primeiro tutorial, porém estou tendo o mesmo problema mencionado pelo amigo acima. Quando executo o projeto a página index.xhtml renderiza apenas a tag a não é renderizada. Como o amigo acima não mencionou o que fez, você tem alguma idéia do que possa ser? Estou utilizando o NetBeans 6.8.

    Forte abraço.

  30. Pedro Henrique Castro
    8 de Outubro de 2010 at 19:51

    Olá José, só pra constar!

    Eram problemas referentes a .jar mesmo. Fiz download de seu exemplo e peguei os sua pasta lib e aí o projeto funcionou.

    Estava procurando um exemplo assim para iniciar meu TCC e agora creio que conseguirei andar com ele, pois até então tinha tentado diversos projetos e não havia tido muito sucesso.

  31. 9 de Outubro de 2010 at 19:32

    Primeiro parabens pelo POST, me ajudou muito. Segundo, cara tentei implementar em cima do teu CRUD uma autenticação de usuário e estou tendo seria dificuldades, será que vc não poderia dar um complemento no POST, colocando a questão de login.

    Fico no aguardo.

    • 9 de Outubro de 2010 at 19:55

      Olá André!
      Obrigado velho…
      Estou afim de fazer isso msmo!
      Vamos ver se essa semana consigo um tempo pra fazer esta melhoria no post!!
      Fique de olho que deve ser o próximo post…
      Abraços!

  32. Luis
    14 de Outubro de 2010 at 15:36

    Uma coisa que eu não entendi mto bem foi: vc chama um livroController.listarLivro

    mas esse método não existe no LivroController, correto?

    • 14 de Outubro de 2010 at 17:00

      Olá Luis,

      O método que existe é getListarLivros() é uma regra que eu esqueci de mencionar, você precisa usar o get para poder utilizar um valor ou lista na view e na hora de acessar é sem o get mesmo e com a primeira letra em minúsculo…

      Qualquer coisa estou ai!

      Abraços!

  33. Marcelo Wanderley
    14 de Outubro de 2010 at 18:45

    Ok Alexandre,

    Irei importar as bibliotecas do seu projeto.

    Outra coisa.
    Como se faz para cadastrar o dados em mais de uma tabela. No caso tabela relacionada?

    public void save(Livro livro) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction t = session.beginTransaction();
    session.save(livro);
    t.commit();
    }

    • 15 de Outubro de 2010 at 9:37

      Você esta interessado em relacionamentos 1 para muitos e muitos para muitos com hibernate?!
      Devo colocar um exemplo 1 para muitos neste CRUD em um próximo artigo junto a segurança utilizando Spring Security…

  34. Felipe
    8 de Novembro de 2010 at 13:50

    No seu exemplo o acesso aos métodos do DAO poderia ser estático ao invés de criar uma nova instância a cada acesso?

    • 8 de Novembro de 2010 at 14:34

      Olá Felipe,

      O ideal seria utilizar inversão de controle para não se preocupar e não precisar dar o new nem deixar static… mais caso esteja apertado com o tempo pra utilizar ioc então pode usar o static…

      Qualquer coisa estou ai!
      Abraços,
      José A Macedo

  35. juniorsatanas
    29 de Novembro de 2010 at 17:50

    Minha Dúvida e como por outra classes relacionada com a que existe, tipo ManyToOne, e como salvar usando um SelectOnMenu !?

    Ficaria agradecido ! com um exemplo !

  36. juniorsatanas
    29 de Novembro de 2010 at 17:50

    Esse exemplo pega com Glasfishe ?

  37. 1 de Dezembro de 2010 at 20:59

    Amigo acho que você esqueceu do faces-config.xml

    • 2 de Dezembro de 2010 at 21:34

      Olá Claudney,
      No jsf 2 o uso do faces-config não é obrigatório, apesar de ja ter havidos casos onde eu precisei cria-lo mas sem descrever nada nele…

      Abraços!

  38. Antonio Marcos
    24 de Março de 2011 at 16:56

    Olá José Alexandre, tudo bem? gostei do seu tutorial, porém quando eu fiz um outro parecido com unidade de federação, a funcionalidade alterar não funcionou. A priori pensei que fosse o scoped que no meu estava como request, fiz a alteração para session e ainda continua com o erro. Gostaria muito de resolver este problema. Desde já meus agradecimentos e continue postando ótimos tutoriais como estes em primefaces, haja vista a dificuldade de encontrarmos material sobre o referido faces.

    • 25 de Março de 2011 at 17:58

      Olá Antonio Marcos,

      Tudo bem e aí?!
      Fico feliz que tenha gostado do tutorial…
      Com relação ao seu problema, qual a mensagem de erro apareceu no seu servidor?! Precisos de mais informações para tentar te ajudar!

      Abraços,
      José Alexandre

  39. Luiz
    24 de Junho de 2011 at 11:06

    Oi José Alexandre,

    Cara, primeiro parabéns pelo Blog, tá me ajudando bastante em várias dúvidas que estou tendo!
    Gostaria que me indicasse o autor construa uma aplicação do começo, usando jsf, hibernate ( ou outra implementação jpa), facelets, primefaces, spring security…pode ser em inglês também. Vi algumas recomendações de livro suas, mas são separadas não é mesmo? Tipo, JSf, Spring Security…

    Estou usando, no momento, o “Programação Java para a Web”, de um brasileiro. Bem didático, porém, ele deixa de eplicar muita coisa, principalmente agora que estou tentando integrar o JSF e o Spring Security…

    Enfim, qualquer recomendação é bem vinda!
    Muito obrigado por compartilhar o conhecimento! Vlw!

    • Luiz
      24 de Junho de 2011 at 11:07

      Só corrigindo :)

      *Gostaria que me indicasse um livro no qual o autor construa…

    • 27 de Junho de 2011 at 16:27

      Olá Luiz,

      Fico feliz que os artigos do blog estejam ajudando nos seus estudos!

      Infelizmente não conheço nenhum livro que englobe tudo que você falou…. recomendo que você tente ir pelos livros separados, por revistas e blogs…
      Caso queira integrar o JSF com Spring, escrevi um artigo para a Java Magazine (nas bancas este mês) que explica como você pode integrar através do Spring Web Flow… daí é possível integrar o Spring Security também…

      Qualquer coisa estou aí!

      Abraços,
      José Alexandre

  40. Marcos Luiz
    17 de Agosto de 2011 at 10:21

    Olá, José Alexandre…
    primeiramente, parabéns pelo post… realmente, EXCELENTE!
    Entretanto, não estou conseguindo resolver algumas coisas:
    1-No index.xhtml, o netbeans não está reconhecendo os campos do livro (propriedade desconhecida). Quando faço +, ele me traz os atributos do DataModel, e não do livro, oque pode estar acontecendo?
    Na hora e executar, ele dá a mensagem “Could not execute query”.

    • Marcos Luiz
      18 de Agosto de 2011 at 11:46

      Olá, Alexandre…
      Pois é…
      Consegui resolver um problema: quanto à “propriedade desconhecida”, resolvi tipando o DataModel (DataModel). Quanto à mensagem “Could not execute query”, descobri que o problema é que a tabela estava com letra minúscula no banco, resolvi colocando a letra inicial minúscula no “from livro”, mas aí veio outro problema: ele está dizendo que a tabela não está mapeada (livro is not maped [from livro]). Estou tentando achar alguma coisa aqui sobre mapeamento com hibernate, mas não estou conseguindo sair do lugar.
      Estou usando Netbeans 7.0.1, com Hibernate 3.2.5 (acredito que seja JPA 1)

  41. Rafael da Silva
    25 de Outubro de 2011 at 15:00

    José, o melhor tutorial e o que eu já encontrei na Net, bem preciso de sua ajuda man. Sou desenvolvedor J2ME a pouco tempo e já faz tempo que eu quero programar para JSF, já segui diversas apostilas, inclusive tenho um execelente livro “Programação Java para Web”, mas não consegui sair do “puto” helloworld…Fiz a primeira parte do seu tuto e me apareceu o mesmo erro que me persegue ’404′ e nenhum erro no console do tomcat7.0. Há alguma outra config a ser feita no web.xml, ou macete?, o projeto esta exatamente como no seu blog, as libs são: jsf.2.1.2api.jar, jsf.2.1.2impl.jar, as do hibernate 3.6.7.Eclipse Indigo 3.7.outra coisa, eu não queria fazer o projeto passo a passo, para melhor fixa-lo, não queria baixa-lo, pois ja esta feito…abrcsss!!!

  42. Francisco
    24 de Dezembro de 2011 at 12:15

    Esse exemplo não é só bom é ótimo.
    O meu funcionou bem, mas tive que criar a tabela no banco com L maisculo de Livro. Isso é assim mesmo ou errei algo?
    Valeu muito esse exemplo era o que eu precisava pra inicar anotattions do hibernate.

  43. 29 de Dezembro de 2011 at 1:37

    Finalmente encontrei um material completo e que ia direto ao assunto!!!

    Primeiramente, muito obrigado pelo tutorial! Procurei por um conteúdo parecido a tempos.
    E em segundo lugar, parabéns!!! O tutorial está realmente muito bom, simples e direto!

  44. 12 de Março de 2012 at 11:42

    Olá José, parabéns pelo post. Tenho uma dúvida na criação das tabelas de usuário. EU sou um pouco fraco em DB. Poderia me enviar o script com as tabelas do banco de dados?

    Não consegui entender isso.l.

  45. Laila
    11 de Abril de 2012 at 22:45

    Quem precisa de faculdade depois da internet =)
    Muito bom!

  46. João Sousa
    18 de Abril de 2012 at 19:32

    Olá José, parabéns pelo post. Tenho uma dúvida em relação ao Hibernate pelo facto na Dao sempre que utilizamos um método temos de abrir a Session (HibernateUtil.getSessionFactory().openSession() ) .i.e. não perdemos em performance ? Ajas melhor usar com o Spring?

    Cumprimentos.

  47. Paulo Furtado
    7 de Maio de 2012 at 14:06

    Boa tarde, estou começando JSF e fiz seu tutorial desde o começo.
    Usei os mesmos nomes para todos os arquivos porém não roda.

    esta dando ExceptionInInitializerError a classe HibernateUtil na linha 30.

    Já peguei as libs que voce usou, copiei e colei seu codigo do HibernateUtil.
    O que poderá ser?
    Aguardo

  48. Bruno
    21 de Maio de 2012 at 15:09

    ótimo artigo, muito obrigado!

    porém…. ao importá-lo no netbeans, recebo 3 erros:

    – faltando biblioteca do mysql
    – faltando biblioteca do junit (???)
    – faltando biblioteca do junit4

    como resolver?
    ps: tentei colocar a biblioteca do mysql 5.x.x.x e parece ter sanado o primeiro problema apenas

    grato

  49. Vitor Andrade De Oliveira
    28 de Maio de 2012 at 2:06

    Amigão eu aproveitei seu codigo no meu projeto, mas estou com o um problema.

    Não consigo mapear as classes a principio na primeira classe deu certo, mas a media que fui inserindo outras, aparece essa mensagem.

    Exception in thread “main” org.hibernate.hql.ast.QuerySyntaxException: emitente is not mapped [from emitente]
    at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)
    at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
    at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
    at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
    at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:77)
    at org.hibernate.engine.query.HQLQueryPlan.(HQLQueryPlan.java:56)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
    at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
    at GD.EmitenteDAO.list(EmitenteDAO.java:32)
    at Utilitario.HibernateTest.main(HibernateTest.java:24)
    Java Result: 1

    Ja tentei criar um xml pra mapear mas nada da certo

  50. patricia
    5 de Junho de 2012 at 9:31

    como faço para trabalhar com um campo Date no hibernate??

  51. Thiago Ferreira Tenório
    19 de Julho de 2012 at 12:10

    E aí José Alexandre! Gostei muito do seu tutorial está simples e prático. Eu executo o projeto e não aparece nenhum erro na linha de saída do servidor, agora quando aparece a tela inicial. Não aparece nenhum dos botões. De adicionar livro e nem o de excluir apenas aparece o título e pronto, a tela fica toda branca, eu segui todo o seu tutorial, mas não aparece nada tela. Se dé pra me ajudar agradeço!

    • 13 de Agosto de 2012 at 20:20

      Thiago,
      Permita me tentar ajudar =D

      Primeiro verifique a conexao com o banco dados e se exite algum livro salvo nele.

      Caso esteja tudo certinho e nao de certo tente isso,

      @ManagedBean
      @Named
      @SessionScoped

      no lugar de so

      @ManagedBean
      @SessionScoped

      Tive um problema parecido, ve se funciona ai e avisa : )

  52. 19 de Julho de 2012 at 16:21

    Uma pequena dúvida…
    Quando eu devo usar as annotations??

  53. 14 de Agosto de 2012 at 20:50

    Queria que fosse deixado e explicado como ficaria para que o banco de dados fosse criado automaticamente.

    sei que o hibernate tem a propriedade abaixo, mas não estou conseguindo fazer o banco de dados ser gerado automaticamente.
    create

  54. alisson menezes
    16 de Agosto de 2012 at 12:03

    muito bom, mais me diz um livro que vc indicar pra JSF para desenvolvimento !
    vlww !

  55. 1 de Outubro de 2012 at 14:21

    hola alexandre soy de bolivia tu tutorial esta buenisimo no se si tendras otro con tres tablas de base de datos donde pueda insertar, actualizar y dar de baja

    bueno es que en mi sistema tengo llamar datos de tres tablas incluso de cuatro

  56. Frabz
    29 de Novembro de 2012 at 14:51

    parabéns cara ficou muito legal , estou aprendendo bastante porém não consigo acessar meus metodos do Bean ja debuguei mais nem entra no metodo não sei o que esta havendo nem erro esta dando pode me ajudar?

  57. diogo braga
    2 de Abril de 2013 at 15:05

    muito bom! funcionou perfeito!

  58. Diogo
    22 de Abril de 2013 at 14:55

    minha duvida seria sobre como adicionar uma terceira classe. e relacionar as outras duas. por exemplo: cliente——vendas—–produtos.

    • Joao
      24 de Abril de 2013 at 15:23

      faça o relacionamento no banco primeiro :)

  59. ivy
    9 de Junho de 2013 at 16:58

    estou fazendo um exemplo parecido só que utilizando o banco de dados postgres.. porém percebi que no seu exemplo vc criou a tabela diretamente no banco. Já que está utilizando o hibernate a tabela não deveria ser criada quando executa o servidor? este é o problema que estou tendo, meu model está mapeando porém não está criando as tabelas no banco

  60. Paulo
    6 de Julho de 2013 at 17:09

    não funcionou nada!!!!

  61. paulo (zangado)
    6 de Julho de 2013 at 19:47

    não sei por que publicou isto ….
    nada funcionou
    faz mais de 10 horas q estou tentando e nada deu certo
    aqui esta oque vc publicou ai….
    usei o eclipse, e não vem com esta que não serve para o eclipse…. prime face 3.5 , jsf 2.0 caraca !!!! perdi meu tempo !!!!
    pena que não dá para colar o print para vc ver

  62. linsspinho
    7 de Julho de 2013 at 23:18

    Eu segui o tutorial usando o Netbeans + tomcat, mas não funcionou. Já era de se esperar! Estou iniciando em JSF e já notei que o tomcat é muito sensivel!!!
    Baixei o seu projeto e funcionou no Netbeans + Glassfish, mas tive que mudar o nome da tabela também para Livro.
    Obrigado pelo tutorial!!

  63. Renato Pires Vieira
    12 de Julho de 2013 at 23:26

    Primeiramente Parabéns pelo POST. Consegui implementar seu exemplo, porém, utilizei outra tabela (Usuário) com apenas 3 atributos. Consigo salvar um registro mas quando tento inserir outro aparece a mensagem:

    javax.faces.el.EvaluationException: org.hibernate.exception.GenericJDBCException: could not insert: [br.com.fastresponse.modelo.Usuario]

    Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33)

    Ficarei grato pela ajuda.

    Abraços e Obrigado.

  64. 6 de Setembro de 2013 at 11:59

    Opa, gostei muito desse CRUD, era realmente o que eu precisava…
    Agora… só a titulo de informação mesmo… para mim no console aparece 3 vezes a mesma consulta…

    Hibernate: select usuario0_.id as id0_, usuario0_.login as login0_ from usuario usuario0_
    Hibernate: select usuario0_.id as id0_, usuario0_.login as login0_ from usuario usuario0_
    Hibernate: select usuario0_.id as id0_, usuario0_.login as login0_ from usuario usuario0_

    isso não faz pesar demais? no caso se for uma estrutura muito grande poderá travar muito o sistema.
    Sabe como corrigir isso?

  65. Roberto
    23 de Setembro de 2013 at 9:52

    Esse exemplo funciona com JSF 1.2 ?

  66. 9 de Outubro de 2013 at 14:04

    tentei rodar no jboss 7 as e tive o seguinte erro:

    INFO [org.jboss.weld.deployer] (MSC service thread 1-4) JBAS016002: Processamento da implantação weld GeLiv.war
    14:00:02,332 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC000001: Failed to start service jboss.deployment.unit.”GeLiv.war”.POST_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit.”GeLiv.war”.POST_MODULE: JBAS018733: Falha ao proceder com a fase POST_MODULE do deployment “GeLiv.war”
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:127) [jboss-as-server-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_25]
    at java.lang.Thread.run(Thread.java:724) [rt.jar:1.7.0_25]
    Caused by: java.lang.NoSuchFieldError: FLOW
    at com.sun.faces.flow.FlowDiscoveryCDIExtension.(FlowDiscoveryCDIExtension.java:90)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.7.0_25]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) [rt.jar:1.7.0_25]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [rt.jar:1.7.0_25]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) [rt.jar:1.7.0_25]
    at org.jboss.as.weld.deployment.processors.WeldPortableExtensionProcessor.loadExtension(WeldPortableExtensionProcessor.java:119)
    at org.jboss.as.weld.deployment.processors.WeldPortableExtensionProcessor.loadAttachments(WeldPortableExtensionProcessor.java:101)
    at org.jboss.as.weld.deployment.processors.WeldPortableExtensionProcessor.deploy(WeldPortableExtensionProcessor.java:87)
    at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:120) [jboss-as-server-7.2.0.Final-redhat-8.jar:7.2.0.Final-redhat-8]

  67. 20 de Outubro de 2013 at 17:11

    Na interface LivroDAO que está no exemplo, temos na linha 14, public List list(); acredito que deveria ser public List list();?

  68. 2 de Novembro de 2013 at 17:45

    Gente! Alguém me ajude por favor! O que acontece quando eu ponho na index o seguinte: #{livro.titulo} aí vem o aviso: Propriedade titulo desconhecida, isso ta me deixando louco pois nunca consigo listar nada.

    • Paulo Dantas
      2 de Novembro de 2013 at 18:09

      isto acontece quando vc não coloca gets setters… (shift+alt+S dentro do bean livro e coloque gets setters.), deve resolver….

  69. 3 de Novembro de 2013 at 0:57

    Marcos Luiz ! Como foi que vc tipou o DataModel? Dá pra vc enviar a sua classe controller pra eu ver?

  70. 3 de Novembro de 2013 at 0:58

    Paulo Dantas. Eu coloquei sim os gets e sets, isso que é estranho.

    • Paulo Dantas
      3 de Novembro de 2013 at 10:18

      vou te passas as 3 classes:

      Pessoabean
      [code]

      package controle;

      import java.io.Serializable;
      import java.util.ArrayList;
      import java.util.List;
      import javax.faces.bean.ManagedBean;
      import javax.faces.event.ActionEvent;
      import modelo.Pessoa;
      import modelo.dao.PessoaDao;

      @SuppressWarnings(“serial”)
      @ManagedBean(name=”pessoaBean”)
      public class PessoaBean implements Serializable {

      Pessoa pessoa = new Pessoa();

      List pessoas = new ArrayList();

      //construtor
      public PessoaBean(){
      pessoas = new PessoaDao().listar();
      pessoa = new Pessoa();
      }

      //Métodos dos botões
      public void cadastrar(ActionEvent actionEvent){
      new PessoaDao().inserir(pessoa);
      pessoas = new PessoaDao().listar();
      pessoa = new Pessoa();
      }

      public void alterar(ActionEvent actionEvent){
      new PessoaDao().alterar(pessoa);
      pessoas = new PessoaDao().listar();
      pessoa = new Pessoa();
      }
      public void excluir(ActionEvent actionEvent){
      new PessoaDao().excluir(pessoa);
      pessoas = new PessoaDao().listar();
      pessoa = new Pessoa();
      }

      //getters and setters
      public Pessoa getPessoa() {
      return pessoa;
      }

      public void setPessoa(Pessoa pessoa) {
      this.pessoa = pessoa;
      }

      @SuppressWarnings(“rawtypes”)
      public List getPessoas() {
      return pessoas;
      }

      @SuppressWarnings({ “rawtypes”, “unchecked” })
      public void setPessoas(List pessoas) {
      this.pessoas = pessoas;
      }
      }

      [/code]

      a classe DAO

      [code]

      package modelo.dao;

      import java.util.List;
      import modelo.Pessoa;
      import org.hibernate.Criteria;
      import org.hibernate.classic.Session;
      import util.HibernateUtil;

      public class PessoaDao extends HibernateUtil {

      private Session session;

      public void inserir(Pessoa pessoa){
      session = (Session) HibernateUtil.getSession();

      try{
      session.beginTransaction();
      session.save(pessoa);
      session.getTransaction().commit();

      }finally{
      session.close();

      }
      }

      public void alterar(Pessoa pessoa){
      session = (Session) HibernateUtil.getSession();

      try{
      session = (Session) HibernateUtil.getSession();
      session.beginTransaction();
      session.saveOrUpdate(pessoa);
      session.getTransaction().commit();
      }finally{
      session.close();

      }
      }

      public void excluir(Pessoa pessoa){
      session = (Session) HibernateUtil.getSession();

      try{
      session = (Session) HibernateUtil.getSession();
      session.beginTransaction();
      session.delete(pessoa);
      session.getTransaction().commit();

      }finally{
      session.close();

      }
      }

      @SuppressWarnings(“unchecked”)
      public List listar(){
      session = (Session) HibernateUtil.getSession();

      try{
      Criteria cri = session.createCriteria(Pessoa.class);
      return cri.list();
      }finally{
      session.close();

      }
      }
      }

      [/code]

      a classe modelo:

      package modelo;

      import javax.persistence.Entity;
      import javax.persistence.GeneratedValue;
      import javax.persistence.GenerationType;
      import javax.persistence.Id;
      import javax.persistence.Table;

      @Entity
      @Table(name=”pessoa”)
      public class Pessoa {

      @Id
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      private int id;

      private String nome;

      private String endereco;

      private String telefone;

      public int getId() {
      return id;
      }

      public void setId(int id) {
      this.id = id;
      }

      public String getNome() {
      return nome;
      }

      public void setNome(String nome) {
      this.nome = nome;
      }

      public String getEndereco() {
      return endereco;
      }

      public void setEndereco(String endereco) {
      this.endereco = endereco;
      }

      public String getTelefone() {
      return telefone;
      }

      public void setTelefone(String telefone) {
      this.telefone = telefone;
      }

      @Override
      public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result
      + ((endereco == null) ? 0 : endereco.hashCode());
      result = prime * result + id;
      result = prime * result + ((nome == null) ? 0 : nome.hashCode());
      result = prime * result
      + ((telefone == null) ? 0 : telefone.hashCode());
      return result;
      }

      @Override
      public boolean equals(Object obj) {
      if (this == obj)
      return true;
      if (obj == null)
      return false;
      if (getClass() != obj.getClass())
      return false;
      Pessoa other = (Pessoa) obj;
      if (endereco == null) {
      if (other.endereco != null)
      return false;
      } else if (!endereco.equals(other.endereco))
      return false;
      if (id != other.id)
      return false;
      if (nome == null) {
      if (other.nome != null)
      return false;
      } else if (!nome.equals(other.nome))
      return false;
      if (telefone == null) {
      if (other.telefone != null)
      return false;
      } else if (!telefone.equals(other.telefone))
      return false;
      return true;
      }

      }

      [/code]

      e o xhtml

      [code]

      body {
      font-size: 62.5%;
      font-family: Lucida Grande, Lucida Sans, Arial, sans-serif;
      }

      input {
      text-transform: uppercase;
      }

      Lista de Pessoas Cadastradas

      [/code]

      espero que ajude, eu peguei isto deste endereço aqui: http://www.lucianotulio.com.br/hibernate-primefaces/

      comigo funfou certinho, espero ter ajudado.

  71. 3 de Novembro de 2013 at 23:02

    Valew amigão! copiei aqui, vou testar amanhã mesmo. Obrigado, até agora meu projeto não funcionou. Pra falar a verdade até agora nunca conseguí listar nada com hibernate. As outras funções funcionam, mas listar não.

  72. Luciano
    11 de Fevereiro de 2014 at 16:18

    Cara, fiz tudo certinho, mais no final minha página ficou em Branco…não aparece nada…pq?? Ajuda ae, valeu!

  73. 30 de Março de 2014 at 8:57

    Olá amigo parabéns pelo seu post, tutorial simples e objetivo. Mas estou um problema pode me ajudar? Bom espero que sim. Quando executo seu projeto ele exibe a seguinte mensagem: C:\Users\Carrapixo\Documents\NetBeansProjects\Geliv\nbproject\build-impl.xml:1011: Warning: Could not find file C:\Users\Carrapixo\Documents\NetBeansProjects\Geliv\${libs.jstl11.classpath} to copy.
    FALHA NA CONSTRUÇÃO (tempo total: 0 segundos) Obrigado

  74. Daniel
    13 de Outubro de 2014 at 15:54

    Ótimo tutorial José, parabéns! Estou há um tempo buscando uma boa explicação de CRUD, pois sou iniciante.

    Um abraço

  75. 28 de Janeiro de 2015 at 14:46

    Parabéns! muito bom o tutorial, com ele consegui entender melhor como funciona o CRUD. Só peço mais um ajuda, a ação Novo Livro e Alterar não estão funcionando, é isso mesmo? Dá o seguinte erro: {Não foi possível encontrar um caso de navegação correspondente na ID de exibição ‘/index.xhtml’ para a ação ‘#{livroController.prepararAlterarLivro}’ com o resultado ‘gerenciarLivro’ }. Já o excluir funciona legal, pois eu inserir dados na tabela livro pelo mysql, e exclui pelo projeto sem problema
    Obrigado!

  76. 3 de Março de 2015 at 14:48

    Boa tarde José Alexandre,
    Me veio uma dúvida, estou começando a aprender o Hibernate e JPA, então eu gostaria de saber o que é mais utilizado hoje.
    Trabalhar com a “Implementação” ou a “Especificação” do JPA ?

  77. Valinho António
    4 de Maio de 2015 at 19:07

    B/dia José Alexandre, tens excelentes posts e por isso estas de parabéns. Sou iniciante na área de programação e agradeceria o favor de me ajudar a identificar o seguinte erro do hibernate gerado na hora da chamada do método save():

    Hibernate: insert into test.estudante (nome, apelido, email) values (?, ?, ?)
    2616 [main] WARN org.hibernate.util.JDBCExceptionReporter – SQL Error: 0, SQLState: S1000
    2618 [main] ERROR org.hibernate.util.JDBCExceptionReporter – Could not retrieve transation read-only status server
    Problemas de: could not insert: [estudanteRental.Estudante]

  78. Fabio Silva
    27 de Junho de 2015 at 3:47

    Olá amigo, tudo bem?
    Primeiramente, parabéns pelo tutorial, ficou excelente! Até salvei nos favoritos!
    Mas gostaria de tirar uma pequena dúvida, seria possível que você exemplificasse a estrutura dos arquivos?
    Estou construindo esse projeto usando Maven, aí como estou iniciando neste, fiquei um pouco na dúvida rsrs’

    Forte abraço!

  79. Junio
    5 de Fevereiro de 2016 at 12:08

    Bom dia.
    Gostei bastante do tutorial , meus parabéns.
    Estou com uma duvida se possível você poderia me ajudar ?
    Refiz todo o projeto quando vou testa-lo , não aparece os botões do CRUD. Nenhum imput esta sendo apresentado para o preenchimento do campo , somente apresenta o nome dos campos , não esta acusando nenhum erro . Não sei se a conexão com o BD esta ocorrendo.

    • JEFERSON
      15 de Junho de 2016 at 17:56

      junio,

      Enquanto o José nao responde, verifique o atributo da header:

      p:dialog header=”PesquisarLivro”

      eu estava com este mesmo problema e verifiquei que o valor :PesquisarLivro estava errado, estava (PesquiaLivro) arrumei isso e deu certo.

  80. Antonio Manoel Coutinho Lopes
    1 de Abril de 2016 at 7:19

    Muito bom e simples. Você tá de parabéns amigo. Valeu mesmo.

  81. JEFERSON
    15 de Junho de 2016 at 17:51

    Olá José, Pode me ajudar com um Problema, Usei seu ensinamento como base para um desenvolvimento aqui de controle de produtos, tudo certo com o fonte, mas não estou conseguindo de forma nenhuma mudar o TEMA (themes.skin)
    Pode me ajudar com este problema?

    Vi que você chama o css no index.html, eu comentei este link baixei um jar do tema cupertino alterei o :

    primefaces.skin
    none

    MAs ainda mas quando subro o Projeto da erro, se descomento o link que chama o css o projeto sobe normalmente mas com o TEMA Skin….

    já tentei de todas as formas mas não consegui mudar o THEMES.

  82. 28 de Janeiro de 2017 at 16:36

    Muito bom o artigo. Parabéns. Fiz um exemplo dele com Maven e Primefaces, só tive um erro de mapeamento da tabela livro mas corrigi adicionando os seguintes codigos na classe Livro:

    @Entity(name=”livro”)
    @Table(name=”livro”)

  83. 5 de Julho de 2017 at 1:03

    Não funciona! Não adianta o que eu faça, a tela fica toda em branco, so mostra o titulo e a tag h1, já fiz tudo, não sei mais o que fazer.

  84. 7 de Julho de 2017 at 15:03

    Nao funciona nada!

  85. Jackson
    10 de Agosto de 2017 at 11:54

    Não funciona mais, importando seu código, da o erro seguinte, não mexi em nada.

    An Error Occurred:
    Could not initialize class Dao.LivroDaoImp

Deixar uma resposta