quinta-feira, 26 de fevereiro de 2015

@Embeddable e @Embedded no JPA

Sejam bem-vindos ao Preciso Estudar Sempre. Hoje iremos falar sobre duas anotações do JPA que são irmãs e não são muito conhecidas. Essas anotações são: @Embeddable e @Embedded. Antes que você me pergunte, eu te já respondo que nesse post não teremos projeto de exemplo pois, ele é de fácil entendimento. Porém, é de nível intermediário/avançado logo, eu espero que você já tenha alguns conhecimentos sobre Java e JPA.

Antes de falarmos de anotações ou annotations, é interessante perguntar: Você sabe o que é uma anotação ?

IMPORTANTE: Lembre-se de que estamos falando do universo Java. 

Uma anotação é um recurso da plataforma Java a qual, foi inserida após a versão 1.5 que, oferece o uso de metadata de forma dinâmica, sem o uso de XML, no código-fonte Java. Essas anotações são interpretadas por um compilador ou pré compilador que irá realizar alguma tarefa pré definida.

Isto é construído através de uma interface (@interface) especial no Java, em que você define os atributos que sua anotação terá. A implementação dessa interface é o uso da anotação, exemplo:

Você criou a anotação @Carro com atributos:
  • Ano
  • Modelo
  • Marca
Quando você usa a anotação @Carro e define valores para seu atributos, exemplificado abaixo, você cria uma implementação dinâmica daquela sua interface especial e pronto, a anotação está funcionando.

 @Carro(ano="2013", marca="Fiat", modelo="Uno")  
 private Carro carro;  

Como é feito para recuperar os valores passados não será abordado aqui mas sim, em um post futuro.

Agora que já sabemos o que é uma anotação, podemos entender o que são essas anotações da JPA. Para você que nunca ouvir falar sobre JPA, ela é uma das partes da plataforma JEE. A JPA representa a API de persistência do Java e possui suporte à ORM (Mapeamento Objeto-Relacional).

JPA = Java Persistence API

Você deve estar pensando agora: "Ainnnn João, com a JPA eu consigo fazer acesso e operações em banco de dados sem usar framework ?"

Sim, você consegue. Na verdade você consegue desenvolver projetos extremamente robustos só com tecnologia Java, sem frameworks. Obviamente que os frameworks nasceram para facilitar nossas vidas e não devemos ignorá-los. Porém, devemos conhecer o poderio de fogo que a nossa linguagem de programação possui.

Falar de @Embeddable e @Embedded sem falar de composição é complicado porque essas anotações trabalham com esse conceito. De uma forma resumida, composição é a técnica de compor uma classe a partir de outras classes, dessa forma você ganha diversas vantagens, como reuso, facilidade de manutenção, etc.

Exemplo:

 public class Funcionario{  
      private Long id; 
      private String nome; 
      private String email; 
      private Date dataNascimento; 
      private String matricula;     
      private Endereco endereco; 
      // gets e sets 
 } 

 public class Endereco{ 
      private Long id; 
      private String logradouro; 
      private String numero; 
      private String bairro; 
      /*outros atributos aqui*/ 
 } 

Acima temos o exemplo de que a classe Funcionario possui um atributo do tipo Endereco, ou seja, a classe Endereco compõe a classe Funcionario. Caso um dia, uma manutenção precise ser feita na classe de Endereco, todas as classes que são compostas por ela serão atualizadas automaticamente. Para refletir tal modelagem na JPA, realizamos as seguintes mudanças:
  • Marco o atributo da composição com a anotação @Embedded.
  • Marco a classe compositora com a anotação @Embeddable.
E nossa classe fica assim:

 @Entity  
 @Table(name="FUNCIONARIO")  
 public class Funcionario{  
   
      @Id  
      @Column("ID")  
      @GeneratedValue(strategy = GenerationType.AUTO)  
      private Long id;  
   
      @Column(name="NM_FUNCIONARIO")  
      private String nome;  
   
      @Column(name="EM_FUNCIONARIO")  
      private String email;  
   
      @Column(name="DT_NASCIMENTO_FUNCIONARIO")  
      private Date dataNascimento;  
   
      @Column(name="MAT_FUNCIONARIO")  
      private String matricula;  
   
      @Embedded  
      private Endereco endereco;  
   
      // gets e sets  
 }  
   
 @Embeddable  
 public class Endereco{
      @Column(name="NM_LOGRADOURO")  
      private String logradouro;

      @Column(name="NUM_LOGRADOURO")  
      private String numero;  

      @Column(name="NM_BAIRRO")  
      private String bairro;  
   
      /*outros atributos aqui*/  
 }  

Não irei explicar aqui o que significam as anotações @Entity, @Table, @Id@Column@GeneratedValue. Farei isso em um outro post.

Quando formos gravar um funcionário no nosso banco de dados, o resultado obtido será.

Figura 1 - Tabela funcionário
É possível notar que as colunas referentes à endereço estão na tabela de funcionário. Isto foi obtido pois a classe Endereco está marcada como @Embeddable e seu atributo como @Embedded. Dessa forma ela compartilha a mesma PK (Primary Key) do funcionário inserido, ou seja, tudo fica na mesma tabela. Não importa se você tem 1 ou 5 atributos embedded, todos ficaram na tabela da entidade que possui os atributos.

Viu !? Não é tão complicado assim !! Este recurso da JPA veio para ajudar os desenvolvedores. Agora você pode aplicar no seu projeto e ser feliz.

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

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

Leia Mais ››

quarta-feira, 11 de fevereiro de 2015

Uma forma legal de aprender inglês

Olá amigos do Preciso Estudar Sempre. O post dessa semana não é um tutorial ou um manual e sim, uma dica para quem quer melhorar ou aprender inglês.

Um amigo encontrou um conjunto de vídeo aulas de inglês os quais, foram feitos para o pró jovem. Nesse momento, você pode pensar:

"Ainnnn João, pró jovem ? Isso é conteúdo do governo, deve ser um lixo !! #chateada"

Você está errado !! Dei uma olhada nas vídeo aulas e são bastante legais. Vale a pena dar um voto de confiança. A abordagem de ensino utilizada é muito legal e a didática é boa. Acredito que as vídeo aulas não te deixarão com um nível avançado ou fluente mas, com certeza em um nível intermediário muito bom. Como disse acima, vale a pena conferir.

Se você acha que inglês é difícil, eu tenho que te contar uma coisa. Você está errado. Inglês não é difícil. Sua cabeça torna difícil. Tudo que faz você sair de sua zona de conforto mental, é complicado para sua mente. Não esmoreça, não deixe o cansaço vencer. Você é tão capaz quanto qualquer um no mundo. Desde do momento que você tem um cérebro em bom estado, nada pode ser impossível para você.

VOCÊ É A ÚNICA PESSOA NO MUNDO QUE PODE IMPOR LIMITES PARA VOCÊ MESMO. 

IMPOSSÍVEL É NADA - Impossible is nothing (ADIDAS)

Segue abaixo o link das vídeo aulas. Agradecimento especial à Bruno Porto.

https://www.youtube.com/playlist?list=PLE62AE41952D6C52B

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

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

Leia Mais ››

sexta-feira, 6 de fevereiro de 2015

Sobrecarga de métodos - Uma reflexão sobre o assunto

Olá amigos leitores do Preciso Estudar Sempre. O tema de hoje é um tema que, provavelmente muitos se sentirão mais familiarizados. Porém, dessa vez não abordaremos esse tema da mesma forma que geralmente ele é abordado.

Na minha opinião, hoje em dia existe um grande problema que, está nas várias camadas da educação brasileira (fundamental, médio, superior, etc.) ou até mundial. O problema é: ensinam as pessoas como fazer mas, não ensinam o porque fazer.

Quando você está na faculdade e aprende seus primeiros conceitos de orientação à objetos, você é apresentado à sobrecarga de métodos. No início, para alguns, pode até parecer complicado ou estranho mas, no fundo não é. Depois de alguns minutos, o aluno domina o assunto e aprende que a sobrecarga não é nada mais, nada menos que, conseguir criar métodos com os mesmos nomes, só mudando a ordem e os tipos dos parâmetros.

Antes que você me pergunte: "Ainnnn João, você vai me ensinar o que é sobrecarga ?"
Eu respondo: "Não !! Se você quer aprender o que é sobrecarga, corre por fora."

Voltando. É aí que mora o problema citado acima e eu te explico o porque. No momento em que o aluno domina o "como fazer" da sobrecarga, ele pode se perguntar ou perguntar ao professor: "Tá bom mas, para que serve isso?"

Geralmente, os professores respondem: "Com este recurso você consegue criar métodos com o mesmo nome e pronto. Não precisa ficar bolando um nome diferente para o mesmo método. Basta mudar os parâmetros."

O professor não respondeu errado mas, ele apresentou o conceito da sobrecarga pela característica mais fraca, na minha opinião. Ele não está errado em ter respondido aquilo mas, ter nomes de funções iguais não é lá algo muito forte, para que você tenha um conceito de orientação à objetos só para isso.

Se é por uma questão de nome, eu crio um método foo() e sobrecarrego ele criando outro chamado foo2() ou fo(). A grande questão da sobrecarga de métodos, ou seja, o que ela traz de tanto benefício para o desenvolvimento de software é realmente a sobrecarga de uma funcionalidade.

Não entendeu ? Vou explicar melhor.

No conceito geral, o que é uma sobrecarga ? Pelo dicionário Michaelis, uma sobrecarga é uma carga excessiva, ou seja, quando você extrapola o que foi definido como carga máxima. É isso que fazemos com os métodos quando sobrecarregamos eles. Estamos adicionando uma carga extra ao contexto de negócio dele.

Exemplo:

 public void cadastrarCliente(Cliente cliente){  
      //trato o negócio de cadastro de cliente e insiro o registro no banco 
 } 

 public void cadastrarCliente(Cliente cliente, boolean flag){ 
      if(flag){ 
           //trato aqui trecho de negócio adicional 
      } 
      this.cadastrarCliente(cliente); 
 } 

Nó código acima podemos notar que existem dois métodos para cadastrar cliente. O primeiro método somente cadastra o cliente e o segundo tem um determinado tratamento de negócio e no fim cadastra o cliente na base de dados. No nosso exemplo, sobrecarregamos o contexto de negócio de cadastro de cliente. Quais vantagens isso me trouxe ?

Bem, vamos lá ! Você, em primeiro lugar, ganhou componentização. Antes você só tinha um método para cadastro de cliente, agora você tem dois. Uma manutenção realizada no método que somente cadastra cliente, irá ser propagada para todos os outros métodos sobrecarregados que o utilizam.

Isso não é ótimo ?

Segunda vantagem: Você ganhou retrocompatibilidade.

Não entendeu ? Ficou confuso ? Então vamos entender !

Vamos supor que você desenvolve uma das APIs do Java. Algo do tipo API de Collections. Na versão 1.0 da sua API, você criou um método para inserir elementos na lista mas, na versão 2.0 você viu que esse método poderia ser melhorado e otimizado. O que você fará ? Apagará o método da API ? Se você fizer isso, todos os projetos que estavam usando a sua API podem apresentar problemas. Realmente, você vai querer causar isso ?

Como solução, o que você pode fazer é: Deixe o método antigo, intocado, crie o novo sobrecarregando o primeiro e marque como deprecated (sua escolha). Dessa forma você ganhou a retrocompatibilidade, falada acima. Você conseguiu gerar uma nova versão da sua API a qual, é compatível com códigos de legado assim como, com novos projetos.

Agora, você fala: "Ainnnn João, to com medo das desvantagens !!! "

Para você ter alguma desvantagem é necessário que você gere ela porque, se a sobrecarga for aplicada da forma correta e com moderação, você só tem a ganhar.

Como esse post é um post de reflexão, eu espero que dúvidas e contestações sejam geradas. Não fique tímido, deixe sua contribuição nos comentários ou no facebook.

Amigos, espero ter ajudado. Caso você tenha alguma dúvida, sugestão ou crítica, deixe aí embaixo nos comentários ou na nossa página do facebook.

Facebook: https://www.facebook.com/precisoestudarsempre/
Leia Mais ››