Projeto Maven com VRaptor e Hibernate com CRUD básico no Eclipse

Desde quando decidi fazer o meu TCC em Java em vez de PHP e ASP.NET, linguagens que tenho mais domínio, enfrentei algumas adaptações, ou seja, cada linguagem impõe uma determinada maneira para se fazer algo, até que é parecido em alguns pontos, mas a mudança é inquestionável. Vejo que existe uma galera ai com dúvidas de como criar um projeto com VRaptor e Hibernate para realizar o famoso CRUD, portanto vou colocar aqui o básico do básico para fazer isso.
Como pré-requisito precisamos de um projeto Maven (caso tenha dúvida de como criar um, sugiro ler isso) com as seguintes dependências no pom.xml:
<dependency>
    <groupid>br.com.caelum.vraptor</groupid>
    <artifactid>vraptor-hibernate</artifactid>
    <version>1.0.0</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupid>org.hibernate</groupid>
    <artifactid>hibernate-core</artifactid>
    <version>3.6.6.Final</version>
    <scope>compile</scope>
    <optional>true</optional>
</dependency> 
<dependency>
    <groupid>mysql</groupid>
    <artifactid>mysql-connector-java</artifactid>
    <version>5.1.24</version>
</dependency>
<dependency>
    <groupid>javax.servlet</groupid>
    <artifactid>jstl</artifactid>
    <version>1.2</version>
    <scope>compile</scope>
</dependency>
Também precisamos do MySQL, do MySQL Workbench para manipularmos o banco (pode ser qualquer outra ferramenta) e do servlet container Apache Tomcat (por isso coloquei como compile o JSTL). Conforme visto nas dependências, temos o básico para usar o Hibernate: suporte do VRaptor para integrar, o core do framework mais o driver do nosso banco ao qual o Hibernate utilizará para lê-lo.
Na atual versão do VRaptor (3.5.0) o suporte ao Hibernate e ao JPA foram migrados para projetos externos, nesse tutorial usaremos o hibernate.cfg.xml, por isso utilizaremos só vraptor-hibernate. Caso quiséssemos usar o persistence.xml, teríamos que colocar uma dependência do vraptor-jpa. Um outro ponto importante é que poderíamos usar o Hibernate 4 pois já existe um suporte do VRaptor para isso.
Para essa postagem, criei um projeto testcrud conforme a figura:

E inseri as dependências no pom.xml (literalmente CTRL C e V do que postei). Para o nosso exemplo, precisamos criar uma estrutura conforme a figura:

A classe UsersController tem o seguinte conteúdo:

Fazendo uma análise rápida, receberemos na construtora da nossa controller, por injeção de dependência, o UserDao e o Result. Para tanto, como veremos a frente, a classe UserDao será marcada com @Component (mais detalhes aqui), mas para o Result não será necessário. Iremos utilizar os seguintes métodos HTTP para a realização do CRUD: POST, GET e PUT (detalhes aqui). As mensagens parametrizadas com o método result.include() serão acessadas através do JSTL nas views.
A classe User tem o seguinte conteúdo:

Para entendimento das anotações utilizadas, sugiro esse tutorial. Lembrando rapidamente um conceito básico, não coloquei @Column nos atributos pois para essa postagem não coloquei um nível de detalhamento maior para cada coluna como, por exemplo, uma restrição. Omitindo essa anotações o Hibernate já entenderá que os atributos são colunas, contudo a única coluna obrigatória que eu tenho que sinalizar é o que representa o atributo identificador.
A classe UserDao tem o seguinte conteúdo:

Essa classe recebe, por injeção de dependência, uma Session do Hibernate, ele encapsula uma conexão para nos comunicarmos com o banco de dados por meio desse objeto para, então, podermos fazer o que queremos (CRUD). Para entender o uso do Criteria API sugiro essa postagem e essa também.
Legal! Como visto no nosso UsersController, precisaremos disponibilizar algumas JSPs por causa dos métodos públicos (tire dúvidas aqui). Para o nosso caso, criaremos o list.jsp e view.jsp. Olhe a estrutura na figura:

O arquivo list.jsp tem o seguinte contéudo:

No nosso UsersController temos um método anotado com @Path("/"), ele retorna uma lista de usuários do banco. Para ler o conteúdo da lista de usuários usaremos o JSTL junto com Expression Language. O dois primeiros hiperlinks dentro do forEach referenciam a view.jsp (com o detalhemento do usuário e sua respectiva edição) e o terceiro sua exclusão. Dependendo da tarefa, apresentaremos uma mensagem (linha 31 à 35). O formulário de cadastro é bem básico, a ação do form encaminha para um método do UsersController e temos um input com o name user.name para que o VRaptor possa instanciar a classe User e, através do método setName() dessa classe, preencher o atributo do objeto.
O arquivo view.jsp tem o seguinte conteúdo:

Esse JSP apenas mostra o nome do usuário e apresenta a possibilidade de alterar o nome dele. Repare que tem um input com o name _method e o value put para podermos utilizar a anotação @Put do VRaptor.
Bom, já temos o básico do básico para realizar o CRUD. Vamos agorar criar o banco de dados e a tabela User:

Já fiz a inserção de dois registros só para efeito de teste para a listagem. Observação: poderíamos ter criado a tabela automaticamente pelo Hibernate conforme mostrado nesse tutorial.
Por fim, só falta o hibernate.cfg.xml. Coloque dentro da source folder src/main/resources e deixe da seguinte maneira:

Pronto, agora é só testar:

Aqlbras!

Comentários

  1. como uso o banco do postgresql em seu exemplo?

    ResponderExcluir
    Respostas
    1. Só alterar o hibernate.cfg.xml e a dependência do driver do banco de dados, em vez de usar do MySQL, conforme nesse tutorial, altere para um do PostgreSQL:

      http://mvnrepository.com/artifact/postgresql/postgresql/9.1-901.jdbc4

      Aqlbras!

      Excluir
  2. Cara, eu segui seu tutorial completo, usei até os mesmos nomes de variáveis, tudo igual, porém, não deu certo. O programa não tem 1 erro, sequer 1 warning, mas na hora que eu coloco pra rodar ele mostra a página de "Hello World" padrão, como se o vraptor não estivesse funcionando. Qual o problema? Fiz algo errado? '-' fiz exatamente igual. :|

    ResponderExcluir
    Respostas
    1. Rbpessoa, se não tem erro e nem warning, é por que o log não subiu corretamente. O JAR log4j está no classpath assim como o log4j.xml? Configure ele para lançar no contexto ROOT logs no nível INFO ou DEBUG.

      O Hello World é do arquivo index.html contido na raiz do seu projeto web, delete-o pois é desnecessário.

      Aqlbras!

      Excluir

Postar um comentário