terça-feira, 24 de março de 2015

Mapeamento objeto-relacional com JPA

Olá amigos do Preciso Estudar Sempre. Hoje falaremos sobre um assunto que muitas pessoas não conhecem de forma plena e só sabem utilizar copiando e colando soluções de outras pessoas. Hoje falaremos sobre mapeamento objeto-relacional com JPA. Mas, antes de tudo, vamos definir o que é o mapeamento objeto relacional.

Mapeamento objeto-relacional é técnica de desenvolvimento que possibilita utilizar a orientação à objetos em sua base de dados relacional mas, como isso funciona? Vamos supor que temos a tabela pessoa e que nesta tabela existem diversas colunas. Utilizando a ORM (Object-Relational Mapping), ou seja, o mapeamento objeto-relacional é possível criar uma classe Pessoa a qual, representará a tabela e com atributos os quais, representarão as colunas.

Esqueça a forma tradicional de se trabalhar com banco de dados. Quando se usa ORM, é somente necessário realizar alterações em nossas coleções de objetos que isto será refletido automaticamente no banco de dados e quando for necessário realizar querys, isso também não será feito da forma tradicional. Antes você manipulava tabelas, agora você manipula classes.

Neste post não abordaremos como realizar querys usando ORM, isto ficará para um próximo post. Hoje entenderemos o básico para poder evoluir depois.

Bem, vamos voltar ao assunto e eis aqui o nosso exemplo:

Figura 1 - Tabela pessoa
Figura 2 - Classe Pessoa
No exemplo acima temos a tabela pessoa e classe Pessoa, ambas mencionadas acima. Porém, não é necessário somente criar a classe e pronto, está funcionando. Faltam ainda umas coisas. O Java não entende automaticamente que tal classe reflete tal tabela. Para isto acontecer, é necessário anotar nossas classes. Se você não sabe o que é uma anotação, clique aqui e leia sobre o assunto.

As anotações que usaremos pertencem à JPA mas, o que é JPA ? Segundo à wikipedia, a JPA é:
Java Persistence API (ou simplesmente JPA) é uma API padrão da linguagem Java que descreve uma interface comum para frameworks de persistência de dados. A JPA define um meio de mapeamento objeto-relacional para objetos Java simples e comuns (POJOs), denominados beans de entidade. Diversos frameworks de mapeamento objeto/relacional como o Hibernate implementam a JPA. Também gerencia o desenvolvimento de entidades do Modelo Relacional usando a plataforma nativa Java SE e Java EE.
A explicação acima é bem clara e agora que já sabemos o que é JPA, podemos aplicar suas anotações na nossa classe Pessoa.

 @Entity  
 @Table(name="pessoa") 
 public class Pessoa implements Serializable{ 

      @Id 
      @Column(name="id", nullable=false) 
      @GeneratedValue(strategy = GenerationType.AUTO) 
      private Long id; 

      @Column(name="nome", nullable = false, length=100) 
      private String nome; 

      @Temporal(TemporalType.DATE) 
      @Column(name = "dataNasc", nullable = false) 
      private Date dataNascimento; 

      private String email; 

      @Column(name="altura", precision=2) 
      private Double altura; 

      @Column(name="peso", precision=3) 
      private Double peso; 

      @Column(name="rg", length=9, unique=true) 
      private Integer rg; 

     /*métodos gets e sets*/ 

 } 

Você deve ter notado que aplicamos várias anotações na nossa classe, vamos entender uma por uma:

@Entity -> Anotação de escopo de classe. Representa que nossa classe será uma entidade a qual, reflete uma entidade do banco de dados e assim, poderemos manipulá-las em querys e outras operações.
@Table -> Anotação de escopo de classe. Representa que nossa entidade refletirá uma tabela do banco de dados e é onde será definido mais informações sobre a tabela alvo.
  • name: Representa o nome da tabela.
@Id -> Anotação de escopo de atributo. Representa que aquele atributo refletirá a PK da nossa tabela.
@Column -> Anotação de escopo de atributo. Representa que o nosso atributo refletirá uma coluna do banco de dados.
  • name: Representa o nome da coluna.
  • nullable: Flag que representa que a coluna aceita valores nulos. Caso seja false, a coluna/atributos não aceita valores nulos, caso contrário, aceita.
  • length: Tamanho da coluna no banco de dados.
  • precision: Usado para valores de ponto flutuante. Representa a quantidade de casas decimais da coluna.
  • unique: Representa que a coluna é uma unique key
@GeneratedValue -> Anotação de escopo de atributo. O atributo que é marcado com essa anotação terá valores gerados automaticamente. Essa anotação é usada para PKs autoincrement.
  • strategy: Representa a forma que os valores serão gerados, podem ser gerador de forma automática, através de sequence, entre outras formas.
@Temporal -> Anotação de escopo de atributo. Esta anotação representa que a coluna será do tipo date.

Você deve ter notado que o atributo email não foi mapeado. Isto não está errado e foi feito de propósito. Quando sua classe é carregada e a JPA vê que um dos atributos não foi mapeado, ela procura uma coluna no banco de dados com o mesmo nome do atributo. Como é possível notar na figura 1, realmente existe uma coluna com o nome de email logo, isto não ocasionará em nenhum erro.

Porém, se você possuir em sua classe um atributo não mapeado e a JPA não encontrar nenhuma coluna que tenha o mesmo nome, isto ocasionará um erro. Atributos não mapeados que não representam colunas do banco de dados devem ser anotados com a anotação @Transient a qual, representa que um determinado atributo de uma classe serve para o transporte de dados (DTO).

Obviamente que existem milhares de anotações e eu não sei todas até porque, isso é humanamente impossível. Neste post, eu abordei as principais, as que são mais usadas nos projetos.

Deixo aí embaixo linkado um post que foi feito aqui no blog em que discutimos sobre outras anotações da JPA. Caso você queira um livro para aprender mais sobre as anotações da JPA, dê uma olhada neste post:
Roteiro de estudo para o livro EJB 3 Profisional - Java Persistence API: http://precisoestudarsempre.blogspot.com.br/2013/09/roteiro-de-estudo-para-o-livro-ejb-3.html

Para baixar o projeto pronto, clique aqui.

Sugestões ?! Críticas ?! Elogios ?! 

Deixe aí nos comentários ou na nossa página do facebook.


Referências:
Criar anotações, é possível ?: http://precisoestudarsempre.blogspot.com.br/2015/03/criar-anotacoes-e-possivel.html
@Embeddable e @Embedded no JPA: http://precisoestudarsempre.blogspot.com.br/2015/02/embeddable-e-embedded-no-jpa.html
Documentação @Column: http://docs.oracle.com/javaee/5/api/javax/persistence/Column.html
Documentação @Entity: http://docs.oracle.com/javaee/5/api/javax/persistence/Entity.html
Documentação @Table: http://docs.oracle.com/javaee/5/api/javax/persistence/Table.html
Documentação @Transient: http://docs.oracle.com/javaee/5/api/javax/persistence/Transient.html

Nenhum comentário: