segunda-feira, 26 de abril de 2010

Um pouquinho do gigante, JPA

Uma Breve pincelada doJPA

Bom, nos conceitos mais "primários", serei bem objetivo, tentarei focar um pouco mais nos mapeamentos.

Então, vamos lá...

O que é JPA?
Java Persistence API.
Uma API de persistencia que possui amplo suporte pela maioria dos grandes players do mercado. (apache, Oracle, JBoss, etc).

ORM = Mapeamento Objeto Relacional.

E quais as principais funcionalidades do JPA?

* Padronizar o Mapeamento Objeto-Relacional
* Utilizar POJO's ao invés de Entity Beans.
* Pode ser utilizado com JSE e JEE.
* Suporta a utilização de diferentes Providers.
* Suporta herança, polimorfismo.

Tudo bem, até o momento, falamos um pouquinho de alguns conceitos relativamente importantes, e agora vamos começar colocar a "mão-na-massa".

Pequena receita de bolo que poderá ser seguida.
1) Download do JPA Provider (http://jpa.hibernate.org)
2) Preparar banco de dados e driver JDBC (http://www.mysql.com/downloads/mysql/)
3) Mapeamento Objeto-Relancional (ORM)
4) Configurar arquivo persistence.xml
5) Implementar aceso a dados via EntityManager

Modelo Relacional



Acima temos um pequeno exemplo de um modelo relacional, com 2 tabelas. Agora vamos fazer o mapeamento entre delas.


Acima, montamos um mapeamento simples entre as duas tabelas. (A classe cliente não foi criada, por isso está sublinhada de vermelho... rs)

Vamos dar "nomes aos bois", o que usamos para criar este mapeamento.

@Entity => com esta anotação (annotations) dizemos que esta classe Pedido, é uma entidade.
obs.: Entidade, é um objeto que pode ser persistido.

@Table => Especifica o nome da tabela no banco de dados. Caso fosse necessário, ainda poderíamos ter passado em qual schema esta tabela estava localizada (name = "pedido", schema = "venda")

@Column => Mapeia um atributo ou uma propriedade (getter) a um campo do banco de dados. Aceita diversas opções de validações.

@Id => Mapeia uma chave primária simples. Podemos gerar a chave automaticamente caso necessite.

@Embeddable => Define que uma classe pode fazer parte de uma entidade
Podemos imaginar a tabela, itemPedido, recebendo as chaves da tabela produto e da tabela pedido, e o mapeamento ficar assim:


Relacionamentos:

@ManyToOne , @OneToMany, @ManyToMany

Agora alguns recursos, que poderão nos ajudar bastante se usados corretamente.

@Version => Define uma coluna para armazenar a informação de versão para o controle de lock otimista. Este recurso, é interessantíssimo, pois podemos imaginar um cenário que duas pessoas estão trabalhando em um mesmo 'formulário', o de cadastro de pessoas, e coincidentemente, estão atualizando dados da mesma pessoa, o Fulano de Tal. A João terminou a sua atualização primeiro que o Pedro, como nosso mapeamento está corretinho, o Pedro irá receber uma Exception, dizendo algo do tipo: "outra transação".

Operações em Cascata:
Persist: Quando uma entidade é persistida, todas as outras nas coleções tbm são.
Merge: Quando uma entidade desconectada é atualizada, todas as outras entidades na coleção são atualizadas.
Remove: Quando uma entidade existente é removida, todas as outras na coleção tbm são.
ALL: Todas a regras anteriores.


Uma das funcionalidades que acho mais interessantes, são os métodos de Callback, quando usados corretamente, podem facilitar bastante a  vida .

> PostLoad, PostPersist, PostRemove, PostUpDate
> PrePersist, PreRemove, PreUpdate

Podem ser utilizados para adicionar funcionalidades extras, como validações, atualizações de tabelas auditadas, etc.
Em um próximo post, falaremos com mais detalhes dos tão Famosos Métodos de Callback.

Cenas para os próximos capítulos: Consultas Estáticas, Consultas Dinâmicas, Criação de Objetos, Configuração do Persistence.xml,

E para concluirmos, fica claro que o JPA nos provê uma API simples e padronizada de persistência, e o uso de annotations simplifica e muito a configuração das entidades.

Vou ficando por aqui, e espero que o Post seja de grande valia.

Nenhum comentário:

Postar um comentário