O Apache Maven é uma ferramenta de gerenciamento de projetos e compressão indispensável no gerenciamento de projetos de todos os tamanhos. O Maven também torna o trabalho do desenvolvedor muito mais fácil quando você precisa utilizar frameworks e bibliotecas diversas que não estão incluídos por padrão no pacote Java que você utiliza. Para começar a fazer uso dos recursos que o Maven nos proporciona vamos utilizar o framework Hibernate e uma biblioteca de acesso a dados da Oracle para criar uma simples aplicação web com o servidor de aplicação Tomcat.
O que é Hibernate?
O Hibernate é um framework para o mapeamento objeto-relacional escrito na linguagem Java, que facilita o mapeamento dos atributos entre uma base tradicional de dados relacionais e o modelo do objeto de uma aplicação, mediante o uso de arquivos (XML) ou anotações Java.
Hibernate: http://hibernate.org/
Configurando o Eclipse e o Maven para criar uma aplicação Web
Nosso foco principal é mostrar como utilizar o Maven para adicionar dependências e mostrar como funciona os pacotes que o Maven utiliza sem que tenhamos que baixa-los e instala-los e também como configurar o Eclipse para que o Tomcat consiga trabalhar em conjunto com o Maven. Não se preocupe em entender todo o código abaixo pois não focaremos em como utilizar o Hibernate agora, futuramente teremos vários outros posts que o contemplarão.
1 – Crie um projeto Maven com o artefato maven-archetype-webapp e o configure adicionado o servidor Tomcat ao Build Path, caso não saiba como fazer isto veja nosso post anterior sobre como utilizar o Maven e o Tomcat clicando aqui.
- Com o projeto criado, clique com o botão direito no seu projeto e escolha Maven->Add Dependency.
- Digite a palavra hibernate e encontre org.hibernate hibernate-core.
- Expanda e selecione sua ultima versão final.
2 – Por padrão os downloads estão desabilitados, precisamos habilita-los para podermos utilizar outras dependências. No menu Window->Preferences digite “maven” e posicione o cursor no tópico Maven e marque os tópicos como na figura abaixo e aguarde o download, talvez precise reinicializar o Eclipse:
3 – Após o carregamento completo das configurações do Eclipse, continue a adicionar mais dependências, desta vez escolha hibernate-validator:
4 – Em seguida adicione hibernate Entity-manager:
5 – Por ultimo adicione Oracle ojdbc14:
6 – Agora abra seu arquivo chamado pom.xml e constatará que ocorreu um erro ao adicionar o driver da Oracle, isto porque o Maven não consegue baixa-lo. Você precisa de um Login gratuito da Oracle para baixar o driver e precisa instala-lo manualmente no Maven, utilize o link abaixo para baixar o arquivo:
ojdbc14: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-10201-088211.html
Para instalar utilize a linha de comando abaixo, atente-se as versões no arquivo pom.xml:
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging=jar -Dfile=ojdbc14.jar -DgeneratePom=true
Use a imagem abaixo para referencia de como instalar a dependência:
Após instalar com sucesso volte ao Eclipse, clique com o botão direito no seu projeto e escolha Maven->Update Project o erro deve desaparecer.
7 – O Tomcat por padrão não consegue utilizar as dependências que o Maven possui, você precisa mudar a configuração. Com o botão direito no seu projeto escolha propriedades e Deployment Assembly:
- Clique em Add.
- Escolha Java Build Path Entries.
- Escolha Maven Dependencies e finalize.
8 – Crie os arquivos para cada código abaixo e rode sua aplicação utilizando o Hibernate para ler um registro do banco de dados:
Exemplo:
Neste exemplo utilizamos o Maven para localizar as dependências necessárias para nosso projeto sem que precisássemos instala-las manualmente. Crie cada arquivo com seu respectivo tipo, utilize a imagem acima para verificar como fica a arvore do seu projeto. Rode o Servlet chamado HelloWorldHibernate.java.
Oracle
-- Cria tabela de funcionários create table Funcionarios( ID_Funcionario NUMBER(5), Nome VARCHAR2(30), Sobrenome VARCHAR2(70), Cargo VARCHAR2(30), Salario NUMBER(9,2)); -- Insere dados na tabela INSERT INTO FUNCIONARIOS VALUES (10, 'John', 'Lennon', 'Compositor', 1234.55);
XML – hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property> <property name="hibernate.connection.username">user</property> <property name="hibernate.connection.password">pass</property> <property name="hibernate.connection.pool_size">10</property> <property name="show_sql">true</property> <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property> <property name="hibernate.current_session_context_class">thread</property> <mapping class="org.desenvolvimento.aberto.Funcionario" /> </session-factory> </hibernate-configuration>
Java
Servlet – Hello World Hibernate
package org.desenvolvimento.aberto; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.hibernate.Session; public class HelloWorldHibernate extends HttpServlet { private static final long serialVersionUID = 1L; public HelloWorldHibernate() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Abre sessão recuperando a conexão Session session = HibernateFactory.getSessionFactory().openSession(); // Inicia transação session.beginTransaction(); // Cria objeto de negocio Funcionario funcionario = new Funcionario(); // Adiciona sessão ao objeto funcionario = (Funcionario) session.load(Funcionario.class, 10); // Cria conteudo HTML response.setContentType("text/html"); PrintWriter html = response.getWriter(); // Retorna valores do objeto html.println("<html>"); html.println("<body>"); html.println("<h1>Desenvolvimento Aberto</h1>"); html.println("<h2>Maven - Dependências ADD: Hibernate Framework: </h2>"); html.println(funcionario.getId() + " - "); html.println(funcionario.getNome() + " "); html.println(funcionario.getSobrenome() + " - "); html.println(funcionario.getCargo() + " - "); html.println(funcionario.getSalario()); html.println("</body>"); html.println("</html>"); // Encerra sessão session.getTransaction().commit(); } }
Hibernate – Session Factory
package org.desenvolvimento.aberto; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateFactory { // Cria objeto da sessão private static final SessionFactory sessionFactory = buildSessionFactory(); // Constroi sessão private static SessionFactory buildSessionFactory() { try { // buildSessionFactory não será utilizado em versões superiores // Veremos outros métodos para criar um Factory // Não é necessário incluir o "hibernate.cfg.xml" no configure() // Incluímos somente a nível de fácil entendimento da chamada da configuração. // Você pode retirar a chamada. return new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); } catch (Throwable ex) { // Em caso de erro System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } } // Retorna Factory da sessão public static SessionFactory getSessionFactory() { return sessionFactory; } // Encerra Sessão public static void shutdown() { getSessionFactory().close(); } }
Objeto de negocio – Funcionário
package org.desenvolvimento.aberto; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; // Define Entidade e tabela @Entity @Table(name = "funcionarios") public class Funcionario { // Define atributos e decoradores Hibernate como ID e colunas @Id @GeneratedValue @Column(name = "ID_FUNCIONARIO") private int id; @Column(name = "NOME") private String nome; @Column(name = "SOBRENOME") private String sobrenome; @Column(name = "CARGO") private String Cargo; @Column(name = "SALARIO") private double salario; // Métodos Getter e Setter public long 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 getSobrenome() { return sobrenome; } public void setSobrenome(String sobrenome) { this.sobrenome = sobrenome; } public String getCargo() { return Cargo; } public void setCargo(String cargo) { Cargo = cargo; } public double getSalario() { return salario; } public void setSalario(double salario) { this.salario = salario; } }