¿Cuál es la diferencia entre JPA e Hibernate? [cerrado]

680

Entiendo que JPA 2 es una especificación e Hibernate es una herramienta para ORM. Además, entiendo que Hibernate tiene más funciones que JPA 2. Pero desde un punto de vista práctico, ¿cuál es realmente la diferencia?

Tengo experiencia en el uso de iBatis y ahora estoy tratando de aprender Hibernate o JPA2. Recogí el libro Pro JPA2 y sigue refiriéndose al "proveedor de JPA". Por ejemplo:

Si cree que una función debería estar estandarizada, debe hablar y solicitarla a su proveedor de JPA

Esto me confunde, así que tengo algunas preguntas:

  • Usando JPA2 solo, ¿puedo obtener datos de DB simplemente anotando mis POJO
  • ¿Se supone que JPA2 se debe usar con un "Proveedor JPA", por ejemplo, TopLink o Hibernate? Si es así, ¿cuál es el beneficio de usar JPA2 + Hibernate en comparación con JPA2 solo o en comparación con Hibernate solo?
  • ¿Me puede recomendar un buen libro práctico JPA2. "Pro JPA2" parece más una biblia y una referencia en JPA2 (no entra en consultas hasta la mitad posterior del libro). ¿Hay un libro que adopte un enfoque de problema / solución para JPA2?
Antonio
fuente
2
La pregunta sobre "la diferencia entre JPA e Hibernate" es incorrecta. Battle Hibernate vs JPA no tiene sentido. Es recomendable utilizar cualquier implementación de JPA con JPA API para evitar implementar diferentes ORM.
BERGUIGA Mohamed Amine
18
@ Berguiga.M.Amine, si ya hemos sabido que la pregunta anterior es incorrecta. No necesitamos preguntar más. También me interesa este tema.
Do Nhu Vy
Tengo una confusión con JpaTemplate usado en primavera "org.springframework.orm.jpa.JpaTemplate" tiene sus propias funciones como persistir (), encontrar (), fusionar () etc.entonces ¿cómo funcionan las cosas sin hibernar?
nitin verma
@nitinverma: Esa es realmente una pregunta separada. Si aún necesita una respuesta, le sugiero que haga su propia pregunta por separado para atraer más comentarios.
Wouter

Respuestas:

776

Como usted dice, JPA es solo una especificación, lo que significa que no hay implementación. Puede anotar sus clases tanto como desee con anotaciones JPA, sin embargo, sin una implementación, nada sucederá. Piense en JPA como las pautas que deben seguirse o como una interfaz, mientras que la implementación de JPA de Hibernate es un código que cumple con la API según lo definido por la especificación JPA y proporciona la funcionalidad bajo el capó.

Cuando usa Hibernate con JPA, en realidad está usando la implementación de Hibernate JPA. El beneficio de esto es que puede cambiar la implementación de JPA de Hibernate por otra implementación de la especificación JPA. Cuando usa Hibernate directo, está bloqueando la implementación porque otros ORM pueden usar diferentes métodos / configuraciones y anotaciones, por lo tanto, no puede simplemente cambiar a otro ORM.

Para una descripción más detallada, lea mi entrada de blog .

Kevin Bowersox
fuente
55
Entonces, cuando está utilizando Hibernate con JPA, ¿las anotaciones {java.persistence} funcionarán o tendrá que usar las anotaciones {org.hibernate}?
Amruta
62
Solo quería agregar que reemplazar un ORM por uno diferente es una ocasión muy rara, por lo que probablemente nunca obtendría este beneficio de usar JPA. Lo que obtienes con JPA es un protocolo, estándares, nombres y otras convenciones que puedes usar para comunicarte con otros.
pubsy
3
@pubsy Estoy de acuerdo, pero en principio ese es uno de los puntos de venta de una especificación.
Kevin Bowersox
66
@Amruta para responder a su pregunta, cuando uno está usando Hibernate con JPA, las anotaciones {java.persistence} funcionarán y no es necesario usar anotaciones {org.hibernate}.
Estudiante el
3
@JavaGeek eso es cierto siempre que el código de uno use solo la interfaz mencionada en JPA. Si uno usa funciones específicas para hibernar, entonces debe usar la org.hibernateanotación. más sobre esto
Suryavanshi
632

JPA es el baile, Hibernate es el bailarín.

johnm
fuente
189
JPA es el arte, Hibernate es el artista.
Lucky
10
Me gusta este sentido del humor :) JPA es director, Hibernate es actor.
user3278897
77
pero, Dancer (Hibernate) puede actuar sin baile (JPA) ¿no es así: /
RevanthKrishnaKumar V.
3
Esta respuesta no explica nada, solo un dicho vago.
Amir Kost el
11
Esta metáfora no agrega comprensión. Si ya conoce la diferencia, la encontrará asombrosa. Si no conoce la diferencia, aún no la sabrá.
Nick Volynkin
158

Algunas cosas son demasiado difíciles de entender sin una perspectiva histórica del lenguaje y la comprensión del PCJ.

A menudo hay terceros que desarrollan paquetes que realizan una función o llenan un vacío que no forma parte del JDK oficial. Por varias razones, esa función puede formar parte del JDK de Java a través del JCP (Proceso de la Comunidad Java)

Hibernate (en 2003) proporcionó una forma de abstraer SQL y permitir a los desarrolladores pensar más en términos de objetos persistentes (ORM). Notifica a hibernate sobre los objetos de su entidad y automáticamente genera la estrategia para persistirlos. Hibernate proporcionó una implementación para hacer esto y la API para impulsar la implementación, ya sea a través de configuraciones XML o anotaciones.

El problema fundamental ahora es que su código se une estrechamente con un proveedor específico (Hibernate) por lo que mucha gente pensó que debería ser más genérico. De ahí la necesidad de una API de persistencia genérica.

Mientras tanto, el JCP con una gran cantidad de aportes de Hibernate y otros proveedores de herramientas ORM estaba desarrollando JSR 220 (Solicitud de especificación de Java) que resultó en JPA 1.0 (2006) y finalmente JSR 317, que es JPA 2.0 (2009). Estas son especificaciones de una API Java Persistence genérica. La API se proporciona en el JDK como un conjunto de interfaces para que sus clases puedan depender de javax.persistence y no preocuparse por el proveedor en particular que está haciendo el trabajo de persistir sus objetos. Esta es solo la API y no la implementación. Hibernate ahora se convierte en uno de los muchos proveedores que implementan la especificación JPA 2.0. Puede codificar para JPA y elegir el proveedor ORM que cumpla con sus necesidades.

Hay casos en los que Hibernate puede darle características que no están codificadas en JPA. En este caso, puede optar por insertar una anotación específica de Hibernate directamente en su clase ya que JPA no proporciona la interfaz para hacer eso.

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

bloque Ken
fuente
2
Buena parte de la historia. mientras que otras respuestas solo repiten lo que está en la pregunta.
Robert
1
Gracias por estas precisiones esclarecedoras. Dijiste que JPA se realizó porque las aplicaciones se unieron estrechamente con Hibernate, era una necesidad de abstracción, ok. ¿Pero no es un problema infinito? ¿No está la aplicación ahora estrechamente acoplada a JPA? ¿Cuál es el beneficio real aquí? Ya veo a Hibernate como una capa de abstracción ...
Aphax
44
@Aphax Claro, y cuando codifica archivos .java también está estrechamente acoplado a Java, entonces, ¿qué pasa si quiero cambiar a Python mañana?
Smutje el
100

JPA es la interfaz mientras que Hibernate es la implementación.

Tradicionalmente ha habido múltiples soluciones Java ORM:

cada implementación define su propia definición de mapeo o API de cliente. El grupo de expertos de JPA reunió lo mejor de todas estas herramientas, por lo que crearon el estándar Java Persistence API.

Una API de persistencia estándar es muy conveniente desde el punto de vista del cliente, lo que hace que sea relativamente fácil cambiar una implementación por otra (aunque en la práctica no es tan simple porque en proyectos grandes tendrá que usar características no estándar específicas de todos modos) .

El estándar JPA ha llevado la competencia Java ORM a un nuevo nivel y esto solo puede conducir a mejores implementaciones.

Como se explica en mi libro, High-Performance Java Persistence , Hibernate ofrece características que aún no son compatibles con JPA :

Estas características adicionales permiten que Hibernate aborde muchos requisitos de persistencia exigidos por las grandes aplicaciones empresariales.

Vlad Mihalcea
fuente
Esta es buena, no conocía otras herramientas ORM anteriormente
Avdhut
¡Gran respuesta y estoy disfrutando el libro tremendamente! ¡Gracias por liberarlo!
JonasJSchreiber
Gracias por disfrutar mi libro Java Persistence de alto rendimiento .
Vlad Mihalcea
Este ~ JPA es la interfaz mientras que Hibernate es la implementación
Eddie B
57

De la Wiki .

Motivación para crear la API de Java Persistence

Muchos desarrolladores Java empresariales utilizan objetos persistentes ligeros proporcionados por marcos de código abierto u Objetos de acceso a datos en lugar de beans de entidad: los beans de entidad y los beans de empresa tenían la reputación de ser demasiado pesados ​​y complicados, y uno solo podía usarlos en servidores de aplicaciones Java EE. Muchas de las características de los marcos de persistencia de terceros se incorporaron a la API de persistencia de Java y, a partir de 2006, proyectos como Hibernate (versión 3.2) y OpenLource Version TopLink Essentials se han convertido en implementaciones de la API de persistencia de Java.

Como se dijo en la página JCP, el enlace de Eclipse es la Implementación de referencia para JPA. Echa un vistazo a esta respuesta por un poco más sobre esto.

JPA en sí tiene características que compensarán un marco ORM estándar. Dado que JPA es parte de la especificación Java EE, puede usar JPA solo en un proyecto y debería funcionar con cualquier servidor compatible con Java EE . Sí, estos servidores tendrán las implementaciones para la especificación JPA.

Hibernate es el marco ORM más popular , una vez que se introdujo el JPA, hibernate se ajusta a las especificaciones JPA . Además del conjunto básico de especificaciones que debe seguir, hibernate proporciona muchas cosas adicionales.

ManuPK
fuente
3
Dicho esto, puedes usar JPA solo en un proyecto. ¿Quiere decir sin usar Hibernate, TopLink o cualquier otra implementación de JPA?
abbas
2
@abbas sí. Las especificaciones Java EE solo usan JPA. Si agrega hibernar, le da algunas características adicionales.
ManuPK
1
Escuché que JPA es solo una interfaz / especificación. Si usamos JPA solo en un proyecto, ¿de dónde obtiene su implementación?
abbas
@abbas gracias por el comentario. He agregado más detalles en la respuesta. Espero que esto ayude.
ManuPK
1
@Forhad Siempre tiene que haber una implementación, ya sea que esté oculto en alguna arquitectura de servidor o no, no hay forma de descargar una biblioteca JPA y hacer que persista por usted.
Kevin Bowersox
15

JPA es solo una especificación que necesita una implementación concreta. La implementación predeterminada que proporciona Oracle es "Eclipselink" ahora. (Toplink es donado por Oracle a la fundación Eclipse para fusionarse con eclipselink)

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

Usando Eclipselink, uno puede estar seguro de que el código es portátil para cualquier implementación si surge la necesidad. Hibernate también es una implementación completa de JPA + MÁS (tipo de JPA Plus). Hibernate es un súper conjunto de JPA con alguna funcionalidad específica adicional de Hibernate. Por lo tanto, la aplicación desarrollada en Hibernate puede no ser compatible cuando se cambia a otra implementación. Todavía hibernar es la elección de la mayoría de los desarrolladores como implementación JPA y ampliamente utilizada.

Otra implementación de JPA es OpenJPA (openjpa.apache.org), que es una extensión de la implementación de Kodo.

supernova
fuente
15

JPA: es como una interfaz y no tiene una implementación concreta para usar funciones que están allí en JPA.

Hibernate: es solo un proveedor de JPA que tiene la implementación de las funciones en JPA y puede tener algunas funciones adicionales que podrían no estar allí en JPA.

CONSEJO: puedes usar

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

Combo 1 : se usa cuando siente que su hibernación no está dando un mejor rendimiento y desea cambiar el proveedor de JPA en ese momento, no tiene que volver a escribir su JPA. Puede escribir otro proveedor JPA ... y puede cambiar tantas veces como pueda.

Combo 2 : se usa mucho menos, ya que cuando no va a cambiar su proveedor de JPA a cualquier costo.

Visite http://blog-tothought.rhcloud.com//post/2 , donde su confusión completa se aclarará.

vkrishna17
fuente
11

JPA es la interfaz, Hibernate es una implementación de esa interfaz.

Thiago Burgos
fuente
2
y encima de eso Hibernate agrega algunas características / métodos más.
rai.skumar
5

JPA es solo una especificación. En el mercado hay muchos proveedores que implementan JPA. Los diferentes tipos de proveedores implementan JPA de manera diferente. así que los diferentes tipos de proveedores brindan diferentes funcionalidades, así que elija el proveedor adecuado según sus requisitos

Si está utilizando Hibernate o cualquier otro proveedor en lugar de JPA, entonces no puede moverse fácilmente para hibernar a EclipseLink o OpenJPA a Hibernate. JPA.

sus007
fuente
4

JPA es una API, que Hibernate implementa. Hibernate es anterior a JPA. Antes de JPA, escribe código de hibernación nativo para hacer su ORM. JPA es solo la interfaz, por lo que ahora escribe código JPA y necesita encontrar una implementación. Hibernate pasa a ser una implementación.

Entonces sus opciones son las siguientes: hibernar, vincular, etc.

La ventaja de JPA es que le permite cambiar su implementación si es necesario. La desventaja es que la API nativa hibernate / toplink / etc ... puede ofrecer funcionalidades que la especificación JPA no admite.

Vanishree Gv
fuente
4

Si bien JPA es la especificación, Hibernate es el proveedor de implementación que sigue las reglas dictadas en la especificación.

javierZanetti
fuente
3

Java: su independencia no es solo del sistema operativo, sino también del proveedor.

Por lo tanto, debería poder implementar su aplicación en diferentes servidores de aplicaciones. JPA se implementa en cualquier servidor de aplicaciones compatible con Java EE y permite intercambiar servidores de aplicaciones, pero luego la implementación también está cambiando. Una aplicación de Hibernate puede ser más fácil de implementar en un servidor de aplicaciones diferente.

Arjan Tijms
fuente
3

JPA es una especificación que implementa en su capa de datos para realizar operaciones db, asignaciones OR y otras tareas requeridas.

Ya que es solo una especificación , necesita una herramienta para implementarla. Esa herramienta puede ser Hibernate, TopLink, iBatis, spring-data, etc.

No necesariamente necesita JPA si está utilizando Hibernate en su capa de datos. Pero si usa la especificación JPA para Hibernate, entonces facilitará el cambio a otras herramientas ORM como iBatis, TopLink en el futuro, porque la especificación también es común para otros.

* ( si recuerdas, lo haces import javax.persistence.*;cuando usas anotaciones para el mapeo OR (como @Id, @Column, @GeneratedValue, etc.) en Hibernate, ahí es donde estás usando JPA en Hibernate, puedes usar JPA's @Query y otras características como bien )

Arun Raaj
fuente
2

JPA es una especificación API de Java que describe la gestión de datos relacionales en aplicaciones que utilizan la plataforma Java. donde como Hibernate es una biblioteca ORM (Object Relational Mapping) que sigue la especificación JPA.

Puede pensar JPA como un conjunto de reglas implementadas por Hibernate.

Badal
fuente
2

JPA es JSR, es decir, el requisito de especificación de Java para implementar el mapeo relacional de objetos que no tiene un código específico para su implementación. Define cierto conjunto de reglas para acceder, persistir y administrar los datos entre objetos Java y la base de datos relacional. Con su introducción, EJB fue reemplazado ya que la comunidad de desarrolladores de Java lo criticó por ser pesado. Hibernate es una de las formas en que JPA se puede implementar usando las pautas. Hibernate es un servicio de consulta y persistencia de objetos / relaciones de alto rendimiento que se licencia bajo la Licencia pública general menor de GNU de código abierto (LGPL). El beneficio de esto es que usted puede cambiar la implementación de JPA de Hibernate por otra implementación de la especificación JPA.

codechefvaibhavkashyap
fuente
1

JPA es solo una especificación que necesita una implementación concreta. La implementación predeterminada proporcionada por Oracle es "Eclipselink" ahora. Oracle dona Toplink a la fundación Eclipse para fusionarse con eclipselink.

Usando Eclipselink, uno puede estar seguro de que el código es portátil para cualquier implementación si surge la necesidad. Hibernate también es una implementación completa de JPA + MÁS. Hibernate es un súper conjunto de JPA con alguna funcionalidad específica adicional de Hibernate. Por lo tanto, la aplicación desarrollada en Hibernate puede no ser compatible cuando se cambia a otra implementación. Todavía hibernar es la elección de la mayoría de los desarrolladores como implementación JPA y ampliamente utilizada.

Otra implementación de JPA es OpenJPA, que es una extensión de la implementación de Kodo.

JPA vs Hibernate


fuente
1

Trato de explicar en palabras muy fáciles.

Supongamos que necesita un automóvil, ya que todos sabemos que hay varios fabricantes de clase A como MERCEDES, BMW, AUDI, etc.

Ahora, en la declaración anterior, CAR (es una especificación) ya que cada automóvil tiene características comunes, como las cosas con 4 ruedas, y se puede conducir en la carretera es un automóvil ... así que es como JPA. Y MERCEDES, BMW, AUDI, etc., solo están utilizando la característica común del automóvil y agregan funcionalidad de acuerdo con su base de clientes, por lo que están implementando las especificaciones del automóvil como hibernación, iBATIS, etc.

Entonces, según estas características comunes, jpa e hibernate es solo una implementación de acuerdo con sus necesidades de jboss.

1 cosa mas

JPA incluye algunas propiedades básicas, por lo que en el futuro si desea cambiar la hibernación a cualquier otra implementación, puede cambiar fácilmente sin mucho dolor de cabeza y para esas propiedades básicas incluye anotaciones JPA que pueden funcionar para cualquier tecnología de implementación, consultas JPQL.

Así que principalmente implementamos hibernación con tecnología de tipo JPA solo en caso de que queramos cambiar nuestra implementación de acuerdo con las necesidades del cliente, además de que escribirá menos código ya que algunas características comunes están involucradas en JPA. Si alguien todavía no está claro, puede comentar como nuevo en el desbordamiento de la pila.

Gracias

Rajiv Baghel
fuente
Gracias por el consejo
rajiv baghel
0

JPA es solo una especificación, mientras que Hibernate es uno de los proveedores de JPA, es decir, hibernate está implementando varias cosas mencionadas en el contrato de JPA.

usuario1157635
fuente
0

JPA o Java Persistence API es una especificación estándar para implementaciones ORM, mientras que Hibernate es la implementación o marco ORM real.

Amit Gujarathi
fuente
-1

JPA es Java Persistence API. Que especifica solo las especificaciones para las API. Significa que el conjunto de reglas y directrices para crear las API. Si dice otro contexto, es un conjunto de estándares que proporciona el contenedor para crear esas API, se puede usar para acceder al objeto de entidad desde la base de datos. JPA es proporcionado por Oracle. Cuando vamos a acceder a la base de datos, definitivamente necesitamos su implementación. Significa que JPA especifica solo pautas para implementar API. Hibernate es un proveedor / proveedor de JPA responsable de implementar esas API. Como Hibernate TopLink y Open JPA son algunos ejemplos de proveedores de API JPA. Entonces, utilizamos API estándar especificadas por JPA a través de hibernación.

Mr.DevEng
fuente
-2

Figurativamente hablando, JPA es solo interfaz, Hibernate / TopLink - clase (es decir, implementación de interfaz).

Debe tener una implementación de interfaz para usar la interfaz. Pero puede usar la clase a través de la interfaz, es decir, usar Hibernate a través de la API JPA o puede usar la implementación directamente, es decir, usar Hibernate directamente, no a través de la API JPA pura.

Un buen libro sobre JPA es "Persistencia Java de alto rendimiento" de Vlad Mihalcea.

Anton Tupy
fuente