Eu vi o Spring, o JPA trabalha em torno de repositórios (camada DAO: se não estou errado). Quero dizer, como é diferente usar 'Spring JPA + Hibernate' ou apenas usar 'Hibernate' diretamente?
Como você disse, JPA é uma especificação, enquanto o Hibernate é uma implementação específica dessa especificação (essas implementações são geralmente chamadas de Provedores ). Ao usar o Hibernate, você se vincula a esse provedor, restringindo sua liberdade de alternar para outra opção quando necessário (por exemplo, você deseja usar o EclipseLink ou o ObjectDB porque o Hibernate tem um bug que interrompe seu processo de desenvolvimento).
Citando Primavera de dados APP 's documentação:
A implementação de uma camada de acesso a dados de um aplicativo é complicada há bastante tempo. Muito código clichê teve que ser escrito. As classes de domínio eram anêmicas e não foram projetadas de maneira real orientada a objetos ou orientada a domínio.
O uso dessas duas tecnologias facilita muito a vida dos desenvolvedores em relação à persistência do modelo de domínio avançado. No entanto, a quantidade de código padrão para implementar repositórios, especialmente ainda é bastante alta. Portanto, o objetivo da abstração do repositório do Spring Data é reduzir significativamente o esforço para implementar camadas de acesso a dados para vários armazenamentos de persistência.
Para resumir, está no topo da JPA adicionando outra camada de abstração, meio que definindo um design baseado em padrão para dar suporte à Camada de Persistência em um contexto Spring. Essas interfaces definidas (conhecidas pelo Spring) fornecem os serviços que a estrutura manipula usando o JPA para fornecer os resultados. Você define um repositório de forma que o Spring possa varrer o projeto e localizá-lo:
<repositories base-package="com.acme.repositories" />
Assim, permitindo que você o use no contexto de um contêiner ou fora dele.
Agora, o que exatamente é Spring, JPA. O Spring, JPA adicionou um pouco mais de funcionalidade (Interfaces) sobre o JPA e ainda é especificado apenas ou também é um provedor de JPA?
O Spring Data JPA fornece uma definição para implementar repositórios que são suportados sob o capô, referenciando a especificação JPA, usando o provedor que você define.
A persistência neste contexto abrange três áreas:
A própria API, definida no
javax.persistence
pacote.A Java Persistence Query Language (JPQL).
Metadados objeto-relacionais.
Recursos:
@Query
consultas anotadas no momento da inicialização@EnableJpaRepositories
fonte
JPA
JPA é uma especificação que padroniza a maneira como os objetos Java são mapeados para um sistema de banco de dados relacional. Sendo apenas uma especificação, JPA consiste de um conjunto de interfaces, como
EntityManagerFactory
,EntityManager
e anotações que ajudam a mapear um objeto de entidade Java a uma tabela de banco de dados.Existem vários provedores de JPA, como HIbernate, EclipseLink ou Open JPA, que você pode usar.
Spring Data JPA
Spring Data JPA é uma abstração de acesso a dados JPA. Assim como o JPA, o Spring Data JPA não pode funcionar sem um provedor de JPA.
O Spring Data JPA oferece uma solução para o padrão DDD
Repository
ou oDAO (Data Acess Object) pattern
. Também pode gerar consultas JPA em seu nome por meio de convenções de nome de método.O Spring Data JPA pode trabalhar com o Hibernate, o Eclipse Link ou qualquer outro provedor de JPA. Um benefício muito interessante do uso do Spring ou Java EE é que você pode controlar os limites da transação declarativamente usando a
@Transactional
anotação .fonte