Introdução ao Spring Data JPA

Introdução ao Spring Data JPA

1. Visão geral

Este artigo se concentrará emintroducing Spring Data JPA into a Spring projecte na configuração completa da camada de persistência. Para obter uma introdução passo a passo sobre como configurar o contexto Spring usando a configuração baseada em Java e o Maven pom básico para o projeto, consultethis article. [more-838] #

2. O Spring Data gerou DAO - No More DAO Implementations

Como discutimos em um artigo anterior,the DAO layer geralmente consiste em muito código clichê que pode e deve ser simplificado. As vantagens de tal simplificação são muitas: uma diminuição no número de artefatos que precisamos definir e manter, consistência dos padrões de acesso a dados e consistência da configuração.

Spring Data leva essa simplificação um passo à frente emakes it possible to remove the DAO implementations entirely. A interface do DAO agora é o único artefato que precisamos definir explicitamente.

Para começar a utilizar o modelo de programação Spring Data com JPA, uma interface DAO precisa estender a interfaceRepository específica de JPA -JpaRepository. Isso permitirá que o Spring Data encontre essa interface e crie automaticamente uma implementação para ela.

Ao estender a interface, obtemos os métodos CRUD mais relevantes para acesso a dados padrão disponíveis em um DAO padrão.

3. Método de acesso personalizado e consultas

Conforme discutido,by implementing one of the Repository interfaces, the DAO will already have some basic CRUD methods (and queries) defined and implemented.

Para definir métodos de acesso mais específicos, o Spring JPA suporta várias opções:

  • simplesmentedefine a new method na interface

  • forneça oJPQ query real usando a anotação@Query

  • use oSpecification and Querydsl support mais avançado em Spring Data

  • definircustom queries por meio de consultas nomeadas JPA

Othird option - as especificações e suporte Querydsl - é semelhante aos critérios JPA, mas usando uma API mais flexível e conveniente. Isso torna toda a operação muito mais legível e reutilizável. As vantagens dessa API serão mais acentuadas ao lidar com um grande número de consultas fixas, pois poderíamos expressá-las de forma mais concisa por meio de um número menor de blocos reutilizáveis.

Esta última opção tem a desvantagem de envolver XML ou sobrecarregar a classe de domínio com as consultas.

3.1. Consultas personalizadas automáticas

Quando Spring Data cria uma nova implementaçãoRepository, ele analisa todos os métodos definidos pelas interfaces e tentaautomatically generate queries from the method names. Embora isso tenha algumas limitações, é uma maneira muito poderosa e elegante de definir novos métodos de acesso personalizados com muito pouco esforço.

Vejamos um exemplo: se a entidade tem um camponame (e os métodosgetNameesetName padrão Java Bean),we’ll define the findByName method in the DAO interface; isso irá gerar automaticamente a consulta correta:

public interface IFooDAO extends JpaRepository {

   Foo findByName(String name);

}

Este é um exemplo relativamente simples. O mecanismo de criação de consulta oferece suporte aa much larger set of keywords.

Caso o analisador não consiga corresponder a propriedade com o campo do objeto de domínio, veremos a seguinte exceção:

java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo

3.2. Consultas personalizadas manuais

Vejamos agora uma consulta personalizada que definiremos por meio da anotação@Query:

@Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)")
Foo retrieveByName(@Param("name") String name);

Para um controle ainda mais refinado sobre a criação de consultas, como usar parâmetros nomeados ou modificar consultas existentes,the reference é um bom lugar para começar.

4. Configuração de transação

A implementação real do DAO gerenciado Spring Data está realmente oculta, pois não trabalhamos com ela diretamente. No entanto, esta é uma implementação simples - the SimpleJpaRepository – which defines transaction semantics using annotations.

Mais explicitamente, isso usa uma anotação@Transactional somente leitura no nível da classe, que é então substituída pelos métodos não somente leitura. O restante da semântica da transação é padrão, mas eles podem ser facilmente substituídos manualmente por método.

4.1. A tradução da exceção está viva e bem

A questão agora é - já que não estamos usando os modelos padrão do Spring ORM (JpaTemplate,HibernateTemplate) - estamos perdendo a tradução da exceção usando Spring Data JPA? Não vamos traduzir nossas exceções JPA para a hierarquiaDataAccessException do Spring?

Claro que não -exception translation is still enabled by the use of the @Repository annotation on the DAO. Essa anotação permite que um pós-processador de bean Spring avise todos os beans@Repository com todas as instânciasPersistenceExceptionTranslator encontradas no Container e forneça tradução de exceção como antes.

Vamos verificar a tradução da exceção com um teste de integração:

@Test(expected = DataIntegrityViolationException.class)
public void givenFooHasNoName_whenInvalidEntityIsCreated_thenDataException() {
    service.create(new Foo());
}

Lembre-se de queexception translation is done through proxies. Para que o Spring possa criar proxies em torno das classes DAO, eles não devem ser declaradosfinal.

5. Configuração de dados Spring

Para ativar o suporte ao repositório Spring JPA, podemos usar a anotação@EnableJpaRepositories e especificar o pacote que contém as interfaces DAO:

@EnableJpaRepositories(basePackages = "com.example.jpa.dao")
public class PersistenceConfig { ... }

Podemos fazer o mesmo com uma configuração XML:

6. A configuração Spring Java ou XML

Já discutimos detalhadamente comoconfigure JPA in Spring em um artigo anterior. Spring Data também tira proveito do suporte Spring para a anotação JPA@PersistenceContext. Ele usa isso para conectarEntityManager ao bean de fábrica do Spring responsável por criar as implementações DAO reais -JpaRepositoryFactoryBean.

Além da configuração já discutida, também precisamos incluir o Spring Data XML Config - se estiver usando XML:

@Configuration
@EnableTransactionManagement
@ImportResource( "classpath*:*springDataConfig.xml" )
public class PersistenceJPAConfig{
   ...
}

7. A dependência do Maven

Além da configuração Maven para JPA definida emprevious article, a dependênciaspring-data-jpa é adicionada:


   org.springframework.data
   spring-data-jpa
   2.1.6.RELEASE

8. Usando o Spring Boot

Também podemos usar a dependênciaSpring Boot Starter Data JPA que irá configurar automaticamente o DataSource para nós.

Também precisamos garantir que o banco de dados que queremos usar esteja presente no caminho de classe. Em nosso exemplo, adicionamos o banco de dados H2 na memória:


   org.springframework.boot
   spring-boot-starter-data-jpa
   2.1.3.RELEASE


    com.h2database
    h2
    1.4.197

É isso, apenas fazendo essas dependências, nosso aplicativo está em funcionamento e podemos usá-lo para outras operações de banco de dados.

A configuração explícita para um aplicativo Spring padrão agora está incluída como parte da configuração automática do Spring Boot.

É claro que podemos modificar a configuração automática adicionando nossa própria configuração explícita.

Spring Boot fornece uma maneira fácil de fazer isso usando propriedades no arquivoapplication.properties:

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

Neste exemplo, alteramos o URL de conexão e as credenciais.

9. Conclusão

Este artigo abordou a configuração e implementação da camada de persistência com Spring 4, JPA 2 e Spring Data JPA (parte do projeto guarda-chuva Spring Data), usando a configuração baseada em XML e Java.

Discutimos maneiras de definir maisadvanced custom queries, bem comoconfiguration with the new jpa namespacee semântica transacional. O resultado final é uma nova e elegante abordagem ao acesso a dados com o Spring, com quase nenhum trabalho de implementação real.

A implementação deste tutorial do Spring Data JPA pode ser encontrada emthe GitHub project.