1.1 Mapeamento de classes para tabelas

Depois de aprender JDBC, você provavelmente terá a impressão de que trabalhar com um banco de dados de um aplicativo Java ainda é um prazer. E se eu te dissesse que todo esse trabalho poderia ser feito 10 vezes mais fácil?

Qual é a principal vantagem da linguagem SQL? Esta é uma linguagem declarativa - descreve o que queremos obter e não diz nada sobre como fazê-lo. Como - esta é a preocupação do servidor SQL.

A mesma abordagem pode ser usada ao trabalhar com bancos de dados.

Em um mundo ideal, poderíamos simplesmente escrever consultas SQL no banco de dados e, em resposta, receberíamos objetos Java prontos ou coleções de objetos Java, se solicitássemos várias partes.

O que posso dizer, foi isso que vários caras pensaram em 2000 e decidiram escrever seu próprio framework ORM.

ORM significa Object-Relational Mapping e é essencialmente um mapeamento de objetos Java para consultas SQL.

Os caras criaram uma coisa muito simples - cada tabela no banco de dados deve corresponder a alguma classe no aplicativo Java . Em uma aplicação Java, operamos com objetos, e esses objetos já sabem como se salvar no banco de dados.

Havia três abordagens para resolver esse problema, e elas eram mais ou menos assim:

  1. O objeto se salva no banco de dados e atualiza seus campos com base nas informações do banco de dados.
  2. O objeto pode se salvar no banco de dados, mas nunca inicia esse caso.
  3. O objeto contém apenas dados e alguém os salva no banco de dados e os carrega a partir do banco de dados.

Inicialmente, a primeira abordagem dominou, então servidores de aplicativos e Enterprise Java Beans se tornaram populares. Havia até uma classe inteira de beans chamada Persistence EJBs que podiam se salvar no banco de dados.

Mas um dia tudo mudou...

1.2 Surgimento do Hibernate

Em 2001, a primeira versão do framework Hibernate foi lançada. Era um framework muito simples, mas permitia o uso de "objetos estúpidos" comuns que não sabiam nada sobre como deveriam ser armazenados no banco de dados ou carregados de lá.

O mapeamento dos campos das classes e colunas Java em uma tabela no banco de dados foi definido por meio de um arquivo XML. E às vezes eles eram bastante volumosos. Ok, quem eu estou enganando. Eram telas pesadas de código XML. E a situação foi salva apenas pelo fato de que há 20 anos não existiam bancos de dados tão gigantescos como agora.

Mas, na verdade, a decisão mais poderosa foi finalmente separar o objeto que precisa ser salvo no banco de dados do código que o salvou lá . Esta solução não é realmente óbvia. Porque o princípio do encapsulamento afirma que o objeto sabe melhor como ele precisa ser salvo e carregado.

E a abordagem ORM realmente quebra esse conceito. A classe de dados expõe sua estrutura interna, mas ficou muito mais fácil operar com grupos de objetos de tipos diferentes.

Um grande avanço veio após o lançamento do Java 5 , quando duas coisas apareceram no JDK:

  • Anotações
  • procurador

AnotaçõesO XML foi suplantado rapidamente e agora era fácil especificar todas as configurações necessárias para mapear uma classe Java para uma tabela no banco de dados diretamente na classe Java.

Proxynão tão perceptível para o usuário do Hibernate, mas sua contribuição foi ainda mais séria. Quando você solicita um objeto ou objetos específicos do Hibernate, ele simplesmente retorna um stub (proxy) e intercepta todas as chamadas para seus métodos.

Isso possibilitou a implementação de vários mecanismos de carregamento lento e elevou a velocidade e a eficiência do Hibernate a um nível completamente altíssimo para a época. O Hibernate se tornou não apenas um padrão de fato da indústria - ele começou a ser traduzido para outros idiomas. Então, por exemplo, o Framework NHibernate apareceu para C#.

1.3 Surgimento da JPA

De facto seguido pelo reconhecimento de jure. Os desenvolvedores do JDK decidiram criar uma especificação sobre como mapear corretamente objetos para tabelas em um banco de dados. Esta especificação é chamadaJPA- API de persistência Java.

Esta é exatamente a especificação. Ele descreve como tudo deve funcionar e quais anotações precisamos para marcar diferentes partes da classe se quisermos que seus objetos sejam salvos no banco de dados.

Parece que os caras simplesmente pegaram o Hibernate como base e mudaram os nomes dos pacotes dele. Porque todas as anotações que estavam no Hibernate foram movidas para o JPA quase uma a uma.

Hoje, o Hibernate implementa totalmente toda a especificação JPA, bem como alguns recursos adicionais que tornam o trabalho com ele ainda mais confortável. Portanto, em termos de padronização, podemos dizer que o Hibernate possui dois conjuntos de recursos:

  • padrão JPA
  • API nativa do Hibernate (funcionalidade adicional)

A documentação oficial do Hibernate descreve assim:

Mas, com base na minha experiência e depois de reler a documentação do Hibernate, posso dizer que o JPA e a API do Hibernate são 95% iguais. Eles são apenas conceitos idênticos.

1.4 Maven para Hibernate

Já que elogiei tanto o Hibernate, acho que é hora de trabalhar um pouco mais com ele.

Em primeiro lugar, existe um site oficial, onde há apenas um monte de documentação em inglês. Ela, claro, tem um viés nas informações de referência, e não no treinamento. Mas ainda é melhor do que depurar as fontes, certo? :)

Instrução:

  1. Você abre o link .
  2. Você olha para ela por um longo tempo.
  3. Voltando ao CodeGym.
  4. Você leu minhas palestras posteriores.

Meu trabalho é simplificar coisas complexas e explicá-las em termos simples. E se você atingiu esse nível, então eu posso fazer isso.

Bem, para começar a usar o Hibernate, você precisa adicioná-lo ao seu pom.xml. Até o momento, já está disponível a 6ª versão do Hibernate, ou melhor, a 6.1.1, então aprenderemos como trabalhar com a versão mais recente.

Basta adicionar estas linhas ao seu pom.xml:


<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

Se você estiver lendo esta palestra fora da janela de 2023+, a nova versão pode ser baixada aqui .

Importante! Algumas das bibliotecas que o Hibernate usa foram descontinuadas no JDK 11 e JDK 17, portanto, se você estiver tendo problemas para colocar seu projeto em funcionamento, adicione estas dependências a ele:


  	<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
  	</dependency>
 
  	<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
  	</dependency>
 
  	<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
  	</dependency>