domingo, 20 de maio de 2007

Iniciando com JPA

JPA, acrônimo de Java Persistence API, que veio junto com o Java EE 5, trouxe diversas funcionalidades que ajudam e muito a vida dos desenvolvedores. A JPA faz parte da especificação EJB 3.0, porém à rumores de que na versão 6 do Java EE ela seja retirada dessa especificação.

A JPA é caracterizada em três áreas:
  • Java Persistence API
  • Query Language
  • Mapeamento Objeto/Relacional
Logo abaixo irei dar exemplos de como inserir uma entidade no banco de dados, utilizando as annotations do EJB 3.0, os objetos do JPA , o banco de dados MySQL 5.0 e o Oracle TopLink como provider.

Iremos precisar de algumas libs para este exemplo, no final do post tem um link para você baixar o exemplo completo, com as classes e as libs necessárias.

- Criando a entidade
Iremos criar a nossa classe de entidade chamada Usuario, que irá possuir os seguintes atributos: id, login, password e nome.
Ela nada mais é do que um simples POJO (Plain Old Java Ob
ject) com alguns atributos, métodos acessores e não herda de nenhuma classe. Em aplicações coorporativas que utilizam toda a especificação EJB é necessário que essas classes possuam mais características, como serialização por exemplo.

Vamos aos códigos:


Figura 1

Na linha 10 eu informo que esse objeto será uma entidade, marcando com a annotation @Entity.
Na linha 11 informo o nome da tabela, atráves da annotation @Table, usando o atributo name da mesma.

Já na linhas 14 e 15, indico que este atributo será um id (marcado com a annotation @Id) e que a sua estratégia de geração de valores no banco será IDENTITY (para o Oracle usa-se SEQUENCE).
Os demais atributos são marcados com @Column, porém não é necessário fazê-lo, a menos que você quizesse utilizar alguns dos atributos dessa annotation, como name, que indica qual vai ser o nome da coluna no banco.

- Criando a classe UsuarioDAO para persistência

Como este post é apenas um exemplo simples de persistência utilizando JPA, criei apenas uma classe DAO (padrão de projeto Data Access Object) que contém o código principal para a persistência.

Figura 2

Na linha 18 eu crio meu objeto factory, recebendo a instância do provider, que irá encontrar o nome do persistence-unit no arquivo persistence.xml.

Em seguinda, na linha 19 eu crio o objeto EntityManager, que é o principal objeto para a persistência na JPA.

O método inserirUsuario utiliza o objeto EntityTransaction, para transações.

Na linha 35 o objeto eu chamo o método persist do objeto EntityManager, passando a entidade para ser gravada no banco.

Existem vários outros métodos relacionados a persistência, como o find, delete, merge e outros. Aconselho dar uma lida na especificação para conhecer estes métodos, quais seus propósitos e suas funcionalidades.

- Arquivo de configuração (persistence.xml)

Esse é o arquivo de configuração, que configura o nome da unidade de persistência, o tipo de transação, as configurações de banco, o provider, as classes de entidades e etc.

Figura 3

Atenção para a linha 15, essa propriedade informa o tipo de geração das tabelas do banco. Na primeira vez que você rodar o exemplo, o provider irá criar as tabelas no schema exemplojpa.

Se você tentar rodar novamente o exemplo sem comentar ou tirar essa linha, irá gerar um erro informando que já existe uma tabela criada no banco, mas os dados irão ser persistidos. Então ao rodar a primeira vez, comente essa linha ou troque o tipo de geração.


Abaixo você poderá fazer o download do exemplo, com as classes, as libs e o persistence.xml (arquivo de configuração).

Este exemplo foi bastante simples e a JPA é bastante vasta, portanto baixe as especificações e estude mais afundo sobre esse excelente meio de persistência!

Download do exemplo
Screencast excelente sobre JPA

8 comentários:

Rafael Tabosa disse...

E ai Rafa, muito legal o artigo, bastante prático para quem quer dar o ponta pé. Estou pensando seriamente de utilizar JPA nos próximos projetos , queria saber se a tecnologia já esta madura, existe algum bug ou impossibilidade no jpa quando os relacionamentos entre as classes são mais complexos ? O pessoal já esta utilizando JPA em larga escala nos projetos ?
Abraços

Rafael Carneiro disse...

Oi Tabosa, obrigado pelo elogio, o seu blog também está excelente, espero que o conteúdo do meu chegue próximo do seu. Sobre o uso da JPA, atualmente estou num projeto de grande porte que a utiliza, sem problemas. No blog do Urubatan ele postou recentemente as novidades sobre a JPA anunciadas no Java One.

Unknown disse...

ta virando moda é fazer blog?!

vou fazer o meu, mas para contar as minhas putarias, pq java no máximo 12 horas por dia :P

P.S.: Num sei quem é o mais bajulador dos dois aí em cima :P

Anônimo disse...

Olá Rafael,
Estou iniciando com JPA se possível gostaria de tirar uma dúvida contigo que tem experiência no assunto. Qual a diferença dos dois tipos de transações JPA e RESOURCE_LOCAL, existe diferença de performance?

grato,
Ezequiel.

Rafael Muniz disse...

Boa Noite Rafael,

Muito bom esse seu artigo... Estou iniciando no JPA e achei bem legal.
Valeu

Junior Sousa disse...

Ótimo exemplo Rafael.

Parabéns !!!

Rafael Carneiro disse...

Obrigado Rafael Muniz e Junior Sousa.

Vejam o que ando escrevendo no endereço www.rafaelcarneiro.com.

Rafael Bortolucci disse...

Olá Rafael,
Muito bom o post sobre JPA, estava ha tempo procurando um exemplo simples que ensinasse do começo ao fim, Parabéns!
[ ]'s.
at+.