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.