Qual é a diferença entre JPA e Hibernate? [fechadas]

680

Entendo que o JPA 2 é uma especificação e o Hibernate é uma ferramenta para ORM. Além disso, entendo que o Hibernate possui mais recursos do que o JPA 2. Mas, do ponto de vista prático, qual é realmente a diferença?

Tenho experiência com o iBatis e agora estou tentando aprender Hibernate ou JPA2. Peguei o livro Pro JPA2 e ele continua se referindo ao "provedor JPA". Por exemplo:

Se você acha que um recurso deve ser padronizado, fale e solicite ao seu provedor de JPA

Isso me confunde, então eu tenho algumas perguntas:

  • Usando o JPA2 sozinho, é possível buscar dados do banco de dados simplesmente anotando meus POJO's
  • O JPA2 deve ser usado com um "provedor JPA", por exemplo, TopLink ou Hibernate? Em caso afirmativo, qual é o benefício de usar o JPA2 + Hibernate em comparação ao JPA2 sozinho ou comparado ao Hibernate sozinho?
  • Você pode recomendar um bom livro prático sobre JPA2. "Pro JPA2" parece mais uma Bíblia e referência ao JPA2 (ele não entra em consultas até a metade final do livro). Existe um livro que adota uma abordagem de problema / solução para o JPA2?
Anthony
fonte
2
A pergunta sobre "a diferença entre JPA e Hibernate" está incorreta. Battle Hibernate vs JPA é inútil. É recomendável usar qualquer implementação de JPA com API JPA para evitar a implementação de ORM diferente.
BERGUIGA Mohamed Amine
18
@ Berguiga.M.Amine, se já sabemos que a pergunta acima está incorreta. Não precisamos mais perguntar. Também tenho interesse neste tópico.
DoNhu Vy #
Eu tenho uma confusão com o JpaTemplate usado na primavera "org.springframework.orm.jpa.JpaTemplate", ele tem suas próprias funções como persist (), find (), merge () etc.) então como as coisas estão funcionando sem hibernar?
Nitin verma
@nitinverma: Essa é realmente uma pergunta separada. Se você ainda precisar de uma resposta, sugiro que faça sua própria pergunta separadamente para atrair mais comentários.
Wouter

Respostas:

776

Como você afirma que o JPA é apenas uma especificação, o que significa que não há implementação. Você pode anotar suas classes o quanto quiser com as anotações JPA, mas sem uma implementação nada acontecerá. Pense na JPA como as diretrizes que devem ser seguidas ou como uma interface, enquanto a implementação da JPA do Hibernate é um código que atende à API conforme definido pela especificação da JPA e fornece a funcionalidade básica.

Ao usar o Hibernate com o JPA, você está realmente usando a implementação do Hibernate JPA. O benefício disso é que você pode trocar a implementação da JPA do Hibernate por outra implementação da especificação da JPA. Quando você usa o Hibernate direto, está bloqueando a implementação porque outros ORMs podem usar métodos / configurações e anotações diferentes; portanto, você não pode simplesmente mudar para outro ORM.

Para uma descrição mais detalhada, leia minha entrada de blog .

Kevin Bowersox
fonte
5
Então, quando você estiver usando o Hibernate com JPA, as anotações {java.persistence} funcionarão ou você terá que usar as anotações {org.hibernate}?
Amruta
62
Eu só queria acrescentar que substituir um ORM por outro é uma ocasião muito rara, portanto você provavelmente nunca obterá esse benefício do JPA. O que você ganha com o JPA é um protocolo, padrões, nomes e outras convenções que você pode usar para se comunicar com outras pessoas.
Pubsy
3
@ pubsy Eu concordo, mas em princípio esse é um dos pontos de venda de uma especificação.
Kevin Bowersox
6
@ Amruta para responder sua pergunta, quando alguém estiver usando o Hibernate com JPA, as anotações {java.persistence} funcionarão e não será necessário usar as anotações {org.hibernate}.
Learner
3
@JavaGeek que é verdadeiro desde que o código esteja usando apenas a interface mencionada no JPA. Se alguém usar recursos específicos para hibernar, precisará usar a org.hibernateanotação. mais sobre isso
Suryavanshi
632

JPA é a dança, Hibernate é a dançarina.

johnm
fonte
189
JPA é a arte, Hibernate é o artista.
1727 Sorte sorte
10
Eu gosto desse senso de humor :) JPA é diretor, Hibernate é ator.
user3278897
7
mas, Dancer (Hibernate) pode realizar sem dança (APP) não é: /
RevanthKrishnaKumar V.
3
Esta resposta não explica nada, apenas um ditado vago.
Amir Kost
11
Essa metáfora não adiciona entendimento. Se você já sabe a diferença, vai achar interessante. Se você não sabe a diferença, ainda não a saberá.
precisa
158

Algumas coisas são difíceis de entender sem uma perspectiva histórica da linguagem e da compreensão do JCP.

Geralmente, existem terceiros que desenvolvem pacotes que executam uma função ou preenchem uma lacuna que não faz parte do JDK oficial. Por vários motivos, essa função pode se tornar parte do Java JDK por meio do JCP (Java Community Process)

O Hibernate (em 2003) forneceu uma maneira de abstrair o SQL e permitir que os desenvolvedores pensassem mais em termos de objetos persistentes (ORM). Você notifica a hibernação sobre seus objetos de entidade e ela gera automaticamente a estratégia para persistir. O Hibernate forneceu uma implementação para fazer isso e a API para conduzi-la através de configurações ou anotações XML.

A questão fundamental agora é que seu código se torna fortemente associado a um fornecedor específico (Hibernate) para o que muitas pessoas pensam que deveria ser mais genérico. Daí a necessidade de uma API de persistência genérica.

Enquanto isso, o JCP com muita entrada do Hibernate e de outros fornecedores de ferramentas ORM estava desenvolvendo o JSR 220 (Java Specification Request), que resultou no JPA 1.0 (2006) e, eventualmente, no JSR 317, que é o JPA 2.0 (2009). Estas são especificações de uma API Java Persistence genérica. A API é fornecida no JDK como um conjunto de interfaces para que suas classes possam depender da javax.persistence e não se preocupar com o fornecedor específico que está fazendo o trabalho de persistir seus objetos. Esta é apenas a API e não a implementação. O Hibernate agora se torna um dos muitos fornecedores que implementam a especificação JPA 2.0. Você pode codificar para a JPA e escolher o fornecedor ORM compatível que atenda às suas necessidades.

Há casos em que o Hibernate pode fornecer recursos que não são codificados no JPA. Nesse caso, você pode optar por inserir uma anotação específica do Hibernate diretamente na sua classe, pois o JPA não fornece a interface para fazer isso.

Fonte: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/

Ken Block
fonte
2
Boa parte da história. enquanto outras respostas estão apenas repetindo o que está em questão.
Robert
1
Obrigado por estas precisões esclarecedoras. Você disse que o JPA foi concluído porque os aplicativos eram bem acoplados ao Hibernate, era uma necessidade de abstração, ok. Mas não é um problema infinito? O aplicativo agora não está acoplado à JPA? Qual é o verdadeiro benefício aqui? Eu já vejo o Hibernate como uma camada de abstração ...
Aphax 29/10
4
@Aphax Claro, e quando você codifica arquivos .java, também é fortemente associado ao Java, e daí se eu quiser mudar para o Python amanhã?
Smutje 3/11
100

JPA é a interface, enquanto o Hibernate é a implementação.

Tradicionalmente, existem várias soluções Java ORM:

cada implementação definindo sua própria definição de mapeamento ou API do cliente. O grupo de especialistas da JPA reuniu o melhor de todas essas ferramentas e, por isso, criou o padrão da Java Persistence API.

Uma API de persistência padrão é muito conveniente do ponto de vista do cliente, tornando relativamente fácil alternar uma implementação pela outra (embora, na prática, não seja tão simples, porque em grandes projetos você precisará usar recursos não padronizados específicos) .

O JPA padrão levou a concorrência do Java ORM a um novo nível e isso só pode levar a melhores implementações.

Conforme explicado no meu livro, Persistência Java de alto desempenho , o Hibernate oferece recursos que ainda não são suportados pelo JPA :

Esses recursos extras permitem ao Hibernate atender a muitos requisitos de persistência exigidos por grandes aplicativos corporativos.

Vlad Mihalcea
fonte
Isso é bom, eu não sabia sobre outras ferramentas ORM anteriores
Avdhut
Ótima resposta e estou gostando muito do livro! Obrigado por liberá-lo!
JonasJSchreiber
Obrigado por desfrutar do meu livro Java Persistence de alto desempenho .
Vlad Mihalcea
Este APP ~ é a interface enquanto Hibernate é a implementação
Eddie B
57

Do Wiki .

Motivação para criar a API de persistência Java

Muitos desenvolvedores corporativos de Java usam objetos persistentes leves fornecidos por estruturas de código-fonte aberto ou objetos de acesso a dados em vez de beans de entidade: beans de entidade e beans corporativos tinham a reputação de serem muito pesados ​​e complicados, e só era possível usá-los em servidores de aplicativos Java EE. Muitos dos recursos das estruturas de persistência de terceiros foram incorporados à Java Persistence API e, em 2006, projetos como o Hibernate (versão 3.2) e a versão de código aberto TopLink Essentials se tornaram implementações da Java Persistence API.

Conforme informado na página JCP, o link Eclipse é a Implementação de Referência para JPA. Veja esta resposta um pouco mais sobre isso.

A própria JPA possui recursos que compensam uma estrutura ORM padrão. Como o JPA faz parte das especificações do Java EE, você pode usá-lo sozinho em um projeto e deve funcionar com quaisquer servidores compatíveis com o Java EE . Sim, esses servidores terão as implementações para a especificação JPA.

O Hibernate é a estrutura ORM mais popular , uma vez que o JPA foi introduzido, o hibernate está em conformidade com as especificações do JPA . Além do conjunto básico de especificações que ele deve seguir, o hibernate fornece muitas coisas adicionais.

ManuPK
fonte
3
Dito isto, você pode usar o JPA sozinho em um projeto. Você quer dizer sem usar o Hibernate, TopLink ou qualquer outra implementação JPA?
abbas
2
@abbas yes. As especificações do Java EE usam apenas JPA. Se você adicionar a hibernação, ela fornecerá alguns recursos adicionais.
ManuPK #
1
Ouvi JPA é apenas uma interface / especificação. Se usarmos o JPA sozinho em um projeto, de onde ele será implementado?
abbas
@abbas obrigado pelo comentário. Eu adicionei mais detalhes na resposta. Espero que isto ajude.
ManuPK 4/13
1
@Forhad Sempre precisa haver uma implementação, esteja ela enterrada em alguma arquitetura de servidor ou não, não há como baixar uma biblioteca JPA e fazer com que ela persista.
precisa
15

A JPA é apenas uma especificação que precisa de implementação concreta. A implementação padrão que o oracle fornece é "Eclipselink" agora. (O Toplink é doado pela Oracle à fundação Eclipse para mesclar com o eclipselink)

(Referência: http://www.oracle.com/technetwork/middleware/toplink/index-085257.html http://www.eclipse.org/org/press-release/20080317_Eclipselink.php )

Usando o Eclipselink, pode-se ter certeza de que o código é portátil para qualquer implementação, se necessário. O Hibernate também é uma implementação JPA completa + MORE (Sort of JPA Plus). O Hibernate é um super conjunto de JPA com algumas funcionalidades específicas adicionais do Hibernate. Portanto, o aplicativo desenvolvido no Hibernate pode não ser compatível quando alternado para outra implementação. Ainda hibernar é a escolha da maioria dos desenvolvedores como implementação JPA e amplamente utilizada.

Outra implementação do JPA é o OpenJPA (openjpa.apache.org), que é uma extensão da implementação do Kodo.

Super Nova
fonte
15

JPA: é como uma interface e não possui implementação concreta para usar funções existentes na JPA.

Hibernate: é apenas um provedor JPA que possui a implementação das funções na JPA e pode ter algumas funções extras que podem não estar presentes na JPA.

DICA: você pode usar

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

Combinação 1 : é usada quando você sente que seu hibernar não está apresentando melhor desempenho e deseja alterar o provedor JPA dessa vez, para que você não precise gravar seu JPA novamente. Você pode escrever outro provedor de JPA ... e pode mudar quantas vezes puder.

Combo 2 : é usado muito menos como quando você não vai mudar seu provedor de JPA a qualquer custo.

Visite http://blog-tothought.rhcloud.com//post/2 , onde sua confusão completa ficará clara.

vkrishna17
fonte
11

JPA é a interface, o Hibernate é uma implementação dessa interface.

Thiago Burgos
fonte
2
Além disso, o Hibernate adiciona mais alguns recursos / métodos.
Rai.skumar
5

A JPA é apenas uma especificação. No mercado, existem muitos fornecedores que implementam a JPA. Diferentes tipos de fornecedores implementam o JPA de maneira diferente. tipos diferentes de fornecedores fornecem funcionalidades diferentes, portanto escolha o fornecedor adequado com base em seus requisitos.

Se você estiver usando o Hibernate ou qualquer outro fornecedor em vez do JPA, não será possível mover facilmente para hibernar para EclipseLink ou OpenJPA para Hibernate.Mas se você usar o JPA, precisará alterar o arquivo XML de persistência. JPA.

sus007
fonte
4

O JPA é uma API implementada pelo Hibernate. O Hibernate é anterior ao JPA. Antes do JPA, você escreve código de hibernação nativo para executar seu ORM. O JPA é apenas a interface, agora você escreve o código JPA e precisa encontrar uma implementação. O Hibernate é uma implementação.

Portanto, suas escolhas são: hibernação, toplink, etc ...

A vantagem do JPA é que ele permite trocar sua implementação, se necessário. A desvantagem é que a API nativa de hibernação / toplink / etc ... pode oferecer funcionalidades que a especificação JPA não suporta.

Vanishree Gv
fonte
4

Enquanto JPA é a especificação, o Hibernate é o provedor de implementação que segue as regras ditadas na especificação.

javierZanetti
fonte
3

Java - sua independência não é apenas do sistema operacional, mas também do fornecedor.

Portanto, você deve poder implantar seu aplicativo em diferentes servidores de aplicativos. O JPA é implementado em qualquer servidor de aplicativos compatível com Java EE e permite trocar servidores de aplicativos, mas a implementação também está mudando. Um aplicativo Hibernate pode ser mais fácil de implantar em um servidor de aplicativos diferente.

Arjan Tijms
fonte
3

JPA é uma especificação que você implementa em sua camada de dados para executar operações de banco de dados, mapeamentos OR e outras tarefas necessárias.

Uma vez que é apenas uma especificação , você precisa de uma ferramenta para implementá-la. Essa ferramenta pode ser Hibernate, TopLink, iBatis, spring-data etc.

Você não precisa necessariamente de JPA se estiver usando o Hibernate na sua camada de dados. Mas se você usar a especificação JPA para o Hibernate, facilitará a mudança para outras ferramentas ORM como o iBatis, TopLink no futuro, porque a especificação também é comum para outras pessoas.

* ( se você se lembra, faz isso import javax.persistence.*;quando usa anotações para mapeamento OR (como @Id, @Column, @GeneratedValue etc.) no Hibernate, é onde você está usando o JPA no Hibernate, pode usar o @Query e outros recursos do JPA como bem )

Arun Raaj
fonte
2

JPA é uma especificação da API Java que descreve o gerenciamento de dados relacionais em aplicativos usando a plataforma Java. onde como Hibernate é uma biblioteca ORM (Object Relational Mapping) que segue a especificação JPA.

Você pode pensar no JPA como um conjunto de regras implementadas pelo Hibernate.

Badal
fonte
2

JPA é JSR, isto é, requisito de especificação Java para implementar o mapeamento relacional de objetos que não possui código específico para sua implementação. Ele define certo conjunto de regras para acessar, persistir e gerenciar os dados entre objetos Java e o banco de dados relacional. Com sua introdução, o EJB foi substituído por ser criticado por ser pesado pela comunidade de desenvolvedores Java. O Hibernate é uma das formas de implementação da JPA usando as diretrizes. O Hibernate é um serviço de consulta e persistência de Objetos / Relacional de alto desempenho, licenciado sob a GNPL Lesser General Public License (LGPL) de código aberto. pode trocar a implementação da JPA do Hibernate por outra implementação da especificação da JPA.

codechefvaibhavkashyap
fonte
1

A JPA é apenas uma especificação que precisa de implementação concreta. A implementação padrão fornecida pelo oracle é "Eclipselink" agora. O Toplink é doado pela Oracle para a Eclipse Foundation para mesclar com o eclipselink.

Usando o Eclipselink, pode-se ter certeza de que o código é portátil para qualquer implementação, se necessário. O Hibernate também é uma implementação JPA completa + MAIS. O Hibernate é um super conjunto de JPA com algumas funcionalidades específicas adicionais do Hibernate. Portanto, o aplicativo desenvolvido no Hibernate pode não ser compatível quando alternado para outra implementação. Ainda hibernar é a escolha da maioria dos desenvolvedores como implementação JPA e amplamente utilizada.

Outra implementação do JPA é o OpenJPA, que é uma extensão da implementação do Kodo.

JPA vs Hibernate


fonte
1

Eu tento explicar com palavras muito fáceis.

Suponha que você precise de um carro, pois todos sabemos que são vários fabricantes de classe A, como MERCEDES, BMW, AUDI etc.

Agora, na declaração acima CAR (é uma especificação), pois todos os carros têm características comuns, como coisa com 4 rodas e podem ser dirigidos na estrada é carro ... então é como JPA. E a MERCEDES, BMW, AUDI etc. estão apenas usando o recurso de carro comum e adicionando funcionalidades de acordo com a base de clientes, para que estejam implementando as especificações do carro como hibernate, iBATIS etc.

Portanto, por esses recursos comuns, o jpa e o hibernate são apenas uma implementação de acordo com a necessidade do jboss.

Mais 1 coisa

O JPA inclui algumas propriedades básicas; portanto, no futuro, se você quiser alterar a hibernação para qualquer outra implementação, poderá alternar facilmente sem muita dor de cabeça e, para essas propriedades básicas, incluir anotações do JPA que podem funcionar para qualquer tecnologia de implementação, consultas JPQL.

Portanto, implementamos principalmente a hibernação com a tecnologia do tipo JPA, apenas para o caso de querermos mudar nossa implementação de acordo com a necessidade do cliente, além de você escrever menos código, pois alguns recursos comuns estão envolvidos no JPA. Se alguém ainda não estiver claro, você pode comentar como sou novo no estouro de pilha.

Obrigado

Rajiv Baghel
fonte
Obrigado pelo conselho
rajiv baghel
0

A JPA é apenas uma especificação, enquanto o Hibernate é um dos fornecedores da JPA, ou seja, o hibernate está implementando várias coisas mencionadas no contrato da JPA.

user1157635
fonte
0

JPA ou Java Persistence API é uma especificação padrão para implementações ORM, enquanto o Hibernate é a implementação ou estrutura real do ORM.

Amit Gujarathi
fonte
-1

JPA é a Java Persistence API. Qual Especifica apenas as especificações para APIs. Significa que o conjunto de regras e diretrizes para criar as APIs. Se diz outro contexto, é um conjunto de padrões que fornece o wrapper para a criação dessas APIs e pode ser usado para acessar o objeto de entidade do banco de dados. A JPA é fornecida pela oracle. Quando vamos fazer o acesso ao banco de dados, precisamos definitivamente de sua implementação. Significa que a JPA especifica apenas diretrizes para implementar APIs. O Hibernate é um fornecedor / fornecedor de JPA responsável pela implementação dessas APIs. Como o Hibernate TopLink e o Open JPA, estão alguns exemplos de provedores de API do JPA. Portanto, usamos APIs padrão especificadas pelo JPA através do hibernate.

Mr.DevEng
fonte
-2

Figurativamente falando, o JPA é apenas interface, classe Hibernate / TopLink (isto é, implementação de interface).

Você deve ter implementação de interface para usar a interface. Mas você pode usar a classe através da interface, ou seja, usar o Hibernate através da API JPA ou usar a implementação diretamente, ou seja, usar o Hibernate diretamente, não através da API JPA pura.

Um bom livro sobre JPA é "Persistência Java de alto desempenho", de Vlad Mihalcea.

Anton Tupy
fonte