Qual é a diferença entre JPA e Spring Data JPA?

144

Estou um pouco confuso sobre a diferença entre o Spring Data-JPA e o JPA. Eu sei sobre o JPA que é uma especificação para persistir os objetos Java em um banco de dados relacional usando a popular tecnologia ORM.

Em outras palavras, o JPA fornece interfaces e outras tecnologias ORM, implementa essas interfaces conhecidas como provedor de JPA, por exemplo, Hibernate.

Agora, o que exatamente é o Spring Data JPA?

O Spring Data JPA adicionou um pouco mais de funcionalidade (Interfaces) sobre o JPA e ainda assim é especificado apenas ou também é um provedor de JPA?

Vi o Spring Data JPA trabalhando em torno de repositórios (camada DAO: se não estou errado). Então, quero dizer, como é diferente usar 'Spring Data JPA + Hibernate' ou usar apenas a direção 'Hibernate'?

DHRUV BANSAL
fonte

Respostas:

126

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.

Fritz
fonte
1
Posso chamar o Repositório de uma coleção de entidades que o Spring gerencia? Não sei por que, mas o suporte ao Spring JPA usando repositórios parece muito semelhante ao EntityManager do EJB - esse é o pensamento certo ou eles são completamente diferentes em seus propósitos? Desde já, obrigado. Mustafa.
Mustafa
1
@Mustafa A maioria das soluções tem bases comuns. Embora o objetivo possa ser o mesmo, a implementação é diferente devido às interfaces envolvidas.
Fritz
35

A API Java Persistence, às vezes referida como JPA, é uma estrutura Java que gerencia dados relacionais em aplicativos usando a Plataforma Java, Standard Edition (JavaSE) e Java Platform, Enterprise Edition (JavaEE).

A persistência neste contexto abrange três áreas:

  • A própria API, definida no javax.persistencepacote.

  • A Java Persistence Query Language (JPQL).

  • Metadados objeto-relacionais.

    insira a descrição da imagem aqui

Spring Data JPA faz parte do projeto abrangente Spring Data que facilita a implementação de repositórios baseados em JPA.

Recursos:

  • Suporte sofisticado para criar repositórios baseados em Spring e JPA
  • Suporte para predicados QueryDSL e, portanto, consultas JPA com segurança de tipo
  • Auditoria transparente da classe de domínio
  • Suporte de paginação, execução dinâmica de consulta, capacidade de integrar código de acesso a dados personalizado
  • Validação de @Query consultas anotadas no momento da inicialização
  • Suporte para mapeamento de entidade baseado em XML
  • Configuração de repositório baseada em JavaConfig, introduzindo @EnableJpaRepositories

    insira a descrição da imagem aqui
Shreyos Adikari
fonte
3

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, EntityManagere 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 DDDRepository ou o DAO (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 @Transactionalanotação .

Vlad Mihalcea
fonte