sexta-feira, 20 de novembro de 2009

Tutorial JPA com Hibernate e SchemaExport (Parte 1)

Fábio Miranda em 18 Out 2008

A JPA (Java Persistence Architecture) é uma poderosa API que o desenvolvedor Java deve dominar. Ela permite que se faça o mapeamento entre um Modelo Orientado a Objetos (OO) e tabelas do Modelo Entidade-Relacionamentos (MER) de um Banco de Dados - em outras palavras, Mapeamento Objeto-Relacional.

Há 3 modos de trabalho: OO >>> MER ou Top Down É sobre esta abordagem que falaremos neste artigo.

OO <<< MER ou Bottom Up Normalmente usado quando se lida com sistemas legados (portanto as tabelas já existem, e há pouca flexibilidade para mudanças nessas tabelas - o modelo OO deve se acomodar ao MER para possibilitar o mapeamento). Pode ser usada também quando se possui uma boa ferramenta de modelagem relacional, e é desejável ter um controle fino da DDL gerada.

OO <<--->> MER ou Meet in the Middle Mesclagem das abordagens anteriores (modela OO, modela ER, realiza mapeamentos (via annotations ou XML), e por fim testa cada entidade para verificar se a persistencia ocorreu conforme desejado).

A abordagem OO >>> MER de longe é a mais interessante das três, permitindo, inclusive, que as tabelas do banco de dados sejam criadas automaticamente, tornando o trabalho muitíssimo produtivo.

Vamos ao que interessa. As ferramentas usadas neste tutorial:

1) Setup

Realize os passos 1 a 3 deste outro post.

2) Configuração JPA no Eclipse

Crie uma pasta lib no seu projeto. Nela, iremos colocar as bibliotecas necessárias para usar o hibernate, para em seguida configurarmos o Build Path (para "importar" as bibliotecas para uso no Eclipse).

Tais bibliotecas podem ser localizadas nos respectivos diretórios descompactados da distribuição Hibernate (exceto as bibliotecas commons, cujas versões mais atualizadas podem ser obtidas no site Apache Commons).

Não podemos esquecer do driver do banco de dados, ou seja copiar C:\JavaDB\lib\derbyclient.jar para Locadora\lib, pois ele será necessário na configuração do Build Path.

Sua pasta lib agora deve parecer como a imagem abaixo:

Para configurar o Build Path, clique com o botão direito no nome do projeto e abra a janela de Propriedades

Escolha a opção para adicionar Jars do projeto

Então selecione todos os jars presentes na pasta lib

O projeto com as bibliotecas importadas deve parecer assim:

3) Persistence.xml

O próximo passo será criar o descritor META-INF/Persistence.xml. Mais abaixo segue o código deste descritor, pronto para copiar.

Neste descritor, devem estar presentes todas as informações relevantes para o Hibernate, por exemplo os parâmetros de acesso ao banco de dados. Estes podem ser fornecidos na forma de parâmetros de conexão JDBC (URL, nome do driver, etc...) ou simplesmente por meio do endereço JNDI de um datasource configurado em um Application Server.

Notar a string de conexão com o BD: jdbc:derby://localhost:1527/locadora;create=true.

- jdbc:derby://localhost:1527 informa onde localizar o Derby - locadora é o nome do banco de dados que será criado - create=true é o parâmetro que informa ao derby que, caso o banco não exista, é pra criá-lo.

Além disso, esse descritor permite que habilitemos funcionalidades interessantes, por exemplo SHOW_SQL, que escreve no console todas as queries que o Hibernate executa, e o Schema Export, que falaremos logo adiante.

4) EntityManagerFactory

Neste passo, criaremos uma classe de teste com um método main, apenas para iniciar a Unidade de Persistência que acabamos de configurar no persistence.xml. Note que está destacado em vermelho o nome da unidade de persistência que iremos utilizar (o mesmo nome que também está destadado em vermelho no descritor acima).

Perceba que podemos ter várias unidades de persistência declaradas no persistence.xml, e que elas podem ser consumidas pela aplicação criando a respectiva Fábrica de EntityManagers, conforme o código acima.

Antes de executar o teste, lembre que o banco de dados deve estar rodando. Caso não esteja, execute StartNetworkDerby. Só em seguida execute a classe de teste, clicando com o botão direito no corpo do método main e execute conforme a figura abaixo.

A execução deste teste deve demorar de 5 a 15s, e ao terminar exibe a mensagem "Schema Export Complete"

Como estamos usando o Derby como banco de dados, note que um novo diretório - locadora - é criado. Neste diretório o Derby armazenará todos os arquivos que dizem respeito a esse schema. Para vizualizá-lo, basta clicar no ícone do projeto e pressionar F5.

5) Modelo OO e Mapeamentos OR

Nesta parte 1 da série, mostraremos apenas uma classe simples, e o respectivo mapeamento com as anotações @Entity, @Id, @GeneratedValue e @Transient. No próximo artigo da série, iremos tratar as demais anotações da JPA. Segue abaixo seu código.

Execute novamente a classe Teste. Iremos verificar o que aconceceu com o banco usando através do plugin DTP do Eclipse (leia este post).

Ao mostrar o persistence.xml, lembra que falamos do Schema Export? Ele pode ser configurado via parâmetro do persistence.xml.

Na inicialização do Hibernate (criação da EntityManagerFactory de uma unidade de persistência), o Schema Export pode criar automaticamente as tabelas do banco de dados, a partir de todas as classes anotadas com @Entity, e seus respectivos mapeamentos objeto-relacionais expressos por meio de anotações Java.

Como resultado, foi criada a tabela PERSON, com os campos ID (chave primária ou Primary Key ou PK) e Name, do tipo varchar. Os campos estáticos e transientes de nossa classe não foram mapeados para colunas do banco de dados.

Note o poder que isto representa: trabalhamos o tempo todo com Java, e de quebra ganhamos o banco de dados prontinho para uso!

Neste artigo, tivemos todo o cuidado de fazer um tutorial hands-on, que qualquer javeiro consiga executar. Nos próximos artigos desta série, iremos nos preocupar apenas com os conceitos Objeto-Relacionais de JPA, mostrando como as classes, hierarquias de classes e relacionamentos são mapeados para tabelas e colunas do banco de dados. E melhor: tudo de forma automática, com o Schema Export que acabamos de mostrar.

Nenhum comentário:

Postar um comentário