terça-feira, 7 de janeiro de 2014

Annotations e Reflection em um ORM

ORM é uma técnica de desenvolvimento utilizada para reduzir a impedância da programação orientada aos objetos utilizando bancos de dados relacionais. As tabelas do banco de dados são representadas através de classes e os registros de cada tabela são representados como instâncias das classes correspondentes.

Para que seja possível o desenvolvimento de uma ferramenta de ORM é necessário um conhecimento de Annotations e de Reflection.
As anotações neste caso são utilizadas para fazer a configuração dos atributos por parte de quem utiliza a ferramenta, fazendo com que a ferramenta interprete essa anotação e se comporte de acordo com a anotação utilizada. Para que seja mais simples entender vamos  ver um exemplo: Supondo que quem está utilizando a ferramenta tenha um objeto Pessoa e dentro dele tem um outro objeto Endereco, os dados desse objeto podem ser salvos tanto em uma tabela endereco ou na própria tabela pessoa,  então cria-se uma anotação para determinar se o endereço dever ser salvo na mesma tabela com os dados das pessoas ou não.
 public class Pessoa {
    @PrimaryKey
    public Integer id;
    public String nome;
    @Embutido
    public Endereco end;
   
                 .
                 .
                 .
}

Como o nosso colega de curso Bruno já fez uma post sobre anotações não irei me extender neste assunto.

Reflection permite um programa Java examinar ou fazer a introspecção nele mesmo, ou seja, olhar e examinar suas propriedades e estrutura. Com isso, você pode, por exemplo obter o nome de todos os membros de uma classe, como atributos e métodos, bem como executar um método usando a Introspection. É deste modo que os aplicativos de ambiente de desenvolvimento (as IDEs) conseguem examinar e exibir a estrutura e conteúdo das classes e beans.
É necessário a utilização desta tecnologia, pois a ferramenta de ORM deve ser genérica para funcionar com qualquer tipo de objeto, com este recurso a ferramenta recebe um objeto como parâmetro sem saber quem é ele e descobre seus atributos e suas configurações através da reflexão,   assim possibilitando o tratamento de cada atributo  de acordo com as suas configurações. Como exemplo vou mostrar uma função que recebe um objeto genérico como parâmetro e descobre qual  atributo é chave primária e o retorna. 

 private Field primaryKey(Object objeto){
  Field[] campos = objeto.getClass().getDeclaredFields();
  for (Field campo : campos) {
   if(campo.isAnnotationPresent(PrimaryKey.class))
   {
    return campo;
   }
  }
  return null;
 }
 
Era wilson pessoal... 

Um comentário:

  1. Nesse link tem mais alguns exemplos sobre reflection em java

    http://prmjuniorblog.blogspot.com.br/2012/08/reflection-em-java.html

    ResponderExcluir