Por que eu devo ler este artigo:Este artigo visa a comparação entre duas excelentes opções de frameworks para o mapeamento entre objetos Java e dados relacionais de banco de dados, o Spring Data JPA e a própria especificação JPA. Ao longo do artigo serão apresentados diversos exemplos que mostrarão como o Spring Data JPA simplifica ainda mais o desenvolvimento de projetos que envolvam operações entre objetos e dados de uma tabela. Para todos os exemplos serão feitas comparações com a especificação JPA e serão mostrados os benefícios de unir os dois frameworks no mesmo projeto.

Durante longos anos, nós, desenvolvedores, tivemos que lidar com as dificuldades de mapeamento e manipulação de objetos em Java para as suas respectivas representações em um banco de dados, registros em uma tabela. O mundo relacional do banco de dados é incompatível com o mundo orientado a objetos porque eles lidam com os dados de maneiras distintas. Enquanto em Java os registros são representados por objetos que possuem comportamento, no banco de dados os registros são representados de forma textual e sem comportamento.

Para diminuir a incompatibilidade entre eles e permitir que objetos sejam representados no banco de dados, foi criada a especificação Java Database Connectivity API, o famoso JDBC. Apesar dos benefícios conquistados, também vieram muitas dificuldades, como problemas de conexão com bancos de dados diversos, casting excessivo de objetos, código complexo para ações simples, ausência de cache de objetos, etc.

Para solucionar os problemas originados com o JDBC, diversos frameworks foram criados e ganharam espaço na comunidade. Um dos mais relevantes foi o Hibernate, que rapidamente se tornou padrão nos pequenos e grandes projetos. Infelizmente essas soluções, conhecidas como frameworks ORM, não seguiam nenhum padrão de desenvolvimento e traziam algumas dificuldades, como: pouco reaproveitamento do conhecimento de um framework em relação a outro, impossibilidade de migração entre os frameworks, quando um deles possuía mais funcionalidades que outros, entre outras questões.

Para resolver esse problema, a Sun lançou, em 2006, o primeiro release de sua nova especificação, a JPA, ou Java Persistence API, para a padronização do mapeamento entre o mundo orientado a objetos e o mundo relacional. A partir desse momento, os frameworks mais utilizados, como o Hibernate, o EclipseLink e o TopLink, passaram a seguir as regras dessa especificação, o que possibilitou a migração de uma solução para a outra de forma fácil, além de uma API simples e padronizada, permitindo o reaproveitamento do conhecimento de um framework em relação a outro.

Apesar das incríveis funcionalidades existentes na especificação JPA, muitas delas são repetitivas, fazendo com que o mesmo código seja reescrito diversas vezes, ou exigem muito código para operações simples. Tendo em vista esse cenário, o Spring criou o framework Spring Data JPA, cujo principal objetivo é permitir que o desenvolvimento com JPA se torne mais fácil, prático e menos repetitivo.

É importante saber que o Spring Data JPA utiliza as próprias funcionalidades da especificação JPA, mas encapsula os seus recursos.

A seguir listamos algumas das principais funcionalidades do Spring Data JPA, que serão analisadas ao longo do artigo, comparando também com o que há de equivalente na especificação JPA:

  • Operações de criação, remoção, modificação e seleção, conhecidas como CRUD;
  • Query Methods;
  • Method Names;
  • Query Annotation;
  • Named Queries;
  • Ordenação.

Configurando o Spring Data JPA

O Spring Data JPA pode ser configurado de diversas formas, por exemplo: fazendo o download manual do seu JAR; usando um gerenciador de dependências, como o Gradle ou o Maven; utilizando o projeto Spring Boot; e até mesmo o projeto JBoss Forge. Para este artigo optamos pelo gerenciador de dependências Maven. Para que o Spring Data JPA seja configurado no Maven, basta adicionar no arquivo pom.xml as linhas indicadas na Listagem 1.

Listagem 1. Declaração da dependência do Spring Data JPA.

<dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-jpa</artifactId>
      <version>1.9.4.RELEASE</version>
  </dependency>

Implementando um CRUD com JPA

É comum que projetos em sua fase inicial comecem com operações básicas de criação, remoção, modificação e seleção de objetos. Para o nosso primeiro exemplo, criaremos um CRUD de funcionários e veremos a primeira comparação entre o framework Spring Data JPA e a especificação JPA.

Na Listagem 2 apresentamos o código da classe Funcionario, já com as anotações da JPA para que seja possível o mapeamento entre essa classe e a tabela funcionario no banco de dados.

Listagem 2. Classe Funcionario sendo mapeada pela JPA.

@Table(name = "funcionario")
  @Entity
  public class Funcionario {
   
      @Id
      @GeneratedValue(strategy = GenerationType.AUTO)
      private Long id;
   
      @Column(name = "nome")
      private String nome;
   
      @Column(name = "sobrenome")
      private String sobrenome;
   
      @Column(name = "cargo")
      private String cargo;
   
      @Column(name = "departamento")
      private String departamento;
   
      @Deprecated
      Funcionario() {
      }
   
      public Funcionario(String nome, String sobrenome, String cargo, String departamento) {
          this.nome = nome;
          this.sobrenome = sobrenome;
          this.cargo = cargo;
          this.departamento = departamento;
      }
   
      // getters e setters omitidos
  }

A seguir temos a descrição de cada anotação da JPA que foi utilizada:

  • @Table: É utilizada para informar o nome da tabela relacionada a essa entidade no banco de dados;
  • @Entity: Indica que a classe será mapeada e passará a ser gerenciada pela JPA;
  • @Column: Nos possibilita fazer algumas configurações, como o nome da coluna no banco de dados, tamanho da coluna, obrigatoriedade de campos, etc.;
  • @Id: Indica que o atributo da classe será gerenciado pela JPA e terá o seu valor automaticamente incrementado;
  • @GeneratedValue: Permite que o banco utilize a estratégia de gerar automaticamente os valores da coluna id, que representa a c ...

    Quer ler esse conteúdo completo? Tenha acesso completo