segunda-feira, 21 de novembro de 2011

Hibernate para iniciantes

Pessoal, neste post vamos demonstrar os passos necessários para utilizar o Hibernate.

O Hibernate é um framework de ORM (Mapeamento objeto-relacional), basicamente é uma maneira de se mapear as tabelas de uma base de dados em objetos no seu programa.

Neste tutorial eu usei o MySQL como base de dados e o Maven para baixar as dependências do projeto, não entrarei em detalhes da instalação do MySQL, sobre o Maven você pode checar o post anterior caso tenha dúvidas.

Primeiramente abra o seu terminal navegue até o diretório onde deseja criar seu projeto e digite o seguinte.

mvn archetype:generate -DgroupId=com.blogspot.runnerdtalks.hibernatetutorial -DartifactId=HibernateTutorial -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
Isso irá criar o esqueleto de um projeto Java, dentro do seu diretório HibernateTutorial que foi criado no comando acima você encontrará o seguinte



Agora abra o arquivo pom.xml e vamos adicionar as dependências do hibernate como no trecho abaixo.
<dependencies>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.4.2</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.18</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>3.3.0.SP1</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
   <artifactId>hibernate-annotations</artifactId>
    <version>3.4.0.GA</version>
    </dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>3.4.0.GA</version>
</dependency>
</dependencies>

Volte ao seu terminal de digita o seguinte:

mvn install
mvn eclipse:eclipse

O primeiro comando irá baixar as dependências e o segundo irá criar os arquivos necessários para transforma-lo em um projeto eclipse.

Abra seu Eclipse e vá em File>Import>Existing Projects into Workspace e de Next.
Clique em Browse e navegue até o diretório onde você mandou o Maven criar o seu projeto, e finalize a importação.


Se esta é a primeira vez que você usa o Maven para criar um projeto no Eclipse será necessário resolver alguns problemas no seu Build Path. 

Clique com o botão direito no projeto, e escolha Properties, escolha Java Build Path>Libraries>Add Variable>Configure Variables... > New...

Em Name coloque M2_REPO
Em Path deve ser o caminho do diretório onde o Maven baixa as dependências, isso varia dependendo do sistema operacional que você usa mas, em sistemas como o Linux e OSX é ~/.m2/repository para Windows fica em C:\Document and Settings\username\.m2 (pode variar dependendo da versão do Windows)

Dê ok em todos os diálogos que estavam abertos, caso seu projeto ainda de erros de compilação vá em Projects>Clean... para forçar a recompilação

No diretório src/res o arquivo hibernate.cfg.xml, esse xml é o responsável por configurar para o hibernate o caminho do banco de dados, usuário senha e etc.

<?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.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.password">tutorial</property>
  <property name="hibernate.connection.username">username</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost/hibernateTutorial</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

  <property name="hibernate.show_sql">true</property>
  <property name="hibernate.format_sql">true</property>
  <property name="hbm2ddl.auto">create</property>

  <mapping class="com.blogspot.runnerdtalks.hibernatetutorial.entity.User"/>
 </session-factory>
</hibernate-configuration>

Veja que já estamos com uma Entity mapeada, no caso a entity User, deixei ela aí já para nos poupar um passo mas é importante lembrar da necessidade de colocar esse mapeamento no XML.
Lembre-se de fazer as devidas alterações nos campos de conexão, como usuário e senha.

Crie também o arquivo log4j.properties no mesmo diretório como abaixo.

log4j.logger.org.hibernate = info, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
Será necessário colocar os arquivos no seu classpath, clique com o botão direito em seu projeto vá em Properties>Java Build Path>Source>Add Folder... adicione o diretório res e clique em ok.

Agora vamos criar a nossa entity User, como já definimos ela no Hibernate.cfg.xml é importante cria-lá no mesmo pacote: com.blogspot.runnerdtalks.hibernatetutorial.entity


Sua entity vai ficar como a seguinte

package com.blogspot.runnerdtalks.hibernatetutorial.entity;

//imports

@Entity
public class User {

 @Id
 @GeneratedValue
 private Long id; 

 private String name;

 private String password;

 //adicione aqui seus getters e setters

}

Veja que a classe esta anotada com @Entity que identifica que essa é uma Entity do Hibernate, e que temos um membro da classse anotado com @Id e @GeneratedValue
  • @ID identifica que ela é a chave primária de sua tabela
  • @GeneratedValue é para o próprio hibernate atribuir os valores para ela automaticamente.


Os outros membros não possuem anotação, mas mesmo assim eles serão automagicamente mapeados para colunas na tabela.

Para sua entity isto é o suficiente

Perceba que temos nossa entity mapeada para uma base de dados que não tem nada criado! É porque agora vamos fazer o Hibernate gerar as tabelas da base de dados baseado em nossa entity.

Conecte no mysql com o comando

mysql -u user -p

Dentro do console do mysql vamos criar a base de dados.

create database hibernateTutorial;

Selecione a base de dados recém criada.

use hibernateTutorial

E execute o seguinte para mostrar as tabelas

show tables;
Seu resultado será algo como o seguinte


Crie uma nova classe no pacote com.blogspot.runnerdtalks.hibernatetutorial.main chamada GenerateSchema.


public class GenerateSchema {

    public static void main( String[] args ) {

     //Le o hibernate.cfg.xml

     AnnotationConfiguration annotationConfiguration = new AnnotationConfiguration();
     annotationConfiguration.configure();

     SchemaExport se = new SchemaExport(annotationConfiguration);
     se.create(true, true);
    }
}
E execute...

O console do eclipse irá mostrar para você diversos detalhes do hibernate se conectando a base de dados e também aparecerá um comando SQL.

Volte ao terminal que você está conectado ao MySQL e execute novamente

show tables;

O resultado deverá mostrar agora a table User, uma tabela não é nada sem dados correto? Então vamos criar uma nova classe chamada CreateNewUser no mesmo pacote do GenerateSchema.


public class CreateNewUser {

 public static void main(String[] args) {

  AnnotationConfiguration annotationConfiguration = new AnnotationConfiguration();
  annotationConfiguration.configure();

  SessionFactory sessionFactory = annotationConfiguration
    .buildSessionFactory();
  Session session = sessionFactory.openSession();

  User user = new User();
  user.setName("root");
  user.setPassword("raquel");

  Transaction transaction = session.beginTransaction();
  session.save(user);
  transaction.commit();
 }
}
Volte ao MySQL e execute

select * from User;

Seu terminal irá exibir o recém criado usuário na tabela.


Caso tenha percebido que sua tabela esteja sendo recriado toda vez que executa o código é por culpa dessa linha no xml.

<property name="hbm2ddl.auto">create</property>

Comente-a e a execução do código não fará mais sua tabela ser recriada.

Código Fonte no GitHub

Valeu!

domingo, 20 de novembro de 2011

Maven



No Util.runNerdTalks(5) falamos sobre Maven.



O Maven, é uma ferramenta para gerenciamento e automação de projetos em Java. Ele é todo baseado em XML, e muito similar ao Ant.





Download

Para fazer o download entre na página oficial, ou baixe via apt-get.



Após instalar verifique via linha de comando se está funcionando:

mvn --version



Aparecerá algo parecido como:







Exemplo Básico

O arquivo básico de configuração é o pom.xml. O pom vem de Project Object Model (POM).



Exemplo básico:

<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.runnerdtalks</groupId>
<artifactId>teste</artifactId>
<version>1.0</version>
</project>

Sendo que:
- modelVersion, é a identificação da versão do arquivo pom.xml (padrão 4.0.0)
- groupId - identificador da empresa / site
- artifactId - nome do projeto
- version - versão do projeto




Criando um projeto novo

Você não precisa digitar todo o xml caso esteja iniciando um projeto novo.



Você pode digitar por exemplo:


mvn archetype:create -DgroupId=com.runnerdtalks -DartifactId=teste -DarchetypeArtifactId=maven-archetype-webapp

Ele construirá um projeto tipo webapp



Ou ainda:

mvn archetype:generate

Assim você escolherá passo a passo as variáveis do projeto.





Adicionando dependências

Para adicionar uma dependência (um jar como o do jUnit por exemplo) a esse projeto, adiciona-se a seguinte estrutura:

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>

Nesse exemplo, adicionamos o jUnit versão 3.8.1.



O Maven baixará automaticamente do seu repositório, o http://mvnrepository.com/ para sua máquina local, colocando-o no diretório .m2/repository (No Unix/Mac OS X pode-se encontrar no ~/.m2 e no Windows – C:\Documents and Settings\username\.m2 )



O .m2/repository é um repositório local, onde será armazenado todos os seus downloads. Assim se você tiver outro projeto que utilizará por exemplo o jUnit 3.8.1, o Maven não precisará baixá-lo novamente.



Mais um exemplo. imagine que você queira usar o hibernate-annotations versão 3.5.6-final. Adicionaremos em nosso pom.xml:

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.5.6-Final</version>
</dependency>



Mas nesse caso o hibernate-annotations também tem suas dependências, como:

org.hibernate.hibernate-core

org.hibernate.hibernate-commons-annotations

org.hibernate.javax.persistence.hibernate-jpa-2.0-api

Assim, além do próprio hibernate-annotations, ele baixará outros jars.



Principais comandos

A partir do pom.xml (que estará na raiz do seu projeto) você digita na linha de comando:

mvn clean - apaga o diretório target, e os .class

mvn compile - compila seu projeto

mvn test - roda os testes unitáros do projeto

mvn install - instala seu projeto (jar/war/etc) no repositório local

mvn deploy - envia o projeto (jar/war/etc) para um servidor remoto





Plugins

O Maven também possui vários plugins (veja mais aqui).

Um exemplo é o plugin para transformar seu projeto em um projeto Eclipse (gerando o .project)



Outros comandos
Alguns comandos interessantes:
mvn dependency:tree - Mostra a dependencia de todos os jars existentes do seu projeto
mvn eclipse:eclipse - Gera o projeto no eclipse


Projeto no Eclipse
Como o Maven já construiu o seu projeto para o Eclipse (após rodar o mvn eclipse:eclipse), você pode simplesmente importar o projeto:




Após isso não esqueça de entrar no "properties" do projeto e configurar a variável M2_REPO
Properties-->Java Build Path -->Add Variable..-->Configure Variables...-->New
Name: M2_REPO
Path: Local do ./m2/repository (No Unix/Mac OS X pode-se encontrar no ~/.m2 e no Windows – C:\Documents and Settings\username\.m2 )


Exemplo
https://github.com/AleUehara/sample-maven

Blog da Caelum - http://blog.caelum.com.br/processo-de-build-com-o-maven/