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.