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

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 usando iBatis y ahora estoy tratando de aprender Hibernate o JPA2. Recogí el libro de Pro JPA2 y sigue refiriéndose al “proveedor de JPA”. Por ejemplo:

Si cree que una característica debe estandarizarse, debe hablar y solicitarla a su proveedor de JPA.

Esto me confunde, así que tengo algunas preguntas:

  • Solo con JPA2 puedo obtener datos de DB simplemente anotando mi POJO
  • ¿Se supone que JPA2 debe usarse con un “Proveedor de 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?
  • ¿Puedes recomendar un buen libro práctico de JPA2? “Pro JPA2” parece más una biblia y referencia en JPA2 (No entra en las consultas hasta la mitad posterior del libro). ¿Hay algún libro que adopte un enfoque de problema / solución para JPA2?

Como afirma, JPA es solo una especificación, lo que significa que no hay implementación. Puedes anotar tus clases tanto como quieras con las anotaciones JPA, sin embargo, sin una implementación, no pasará nada. Piense en JPA como las pautas que se deben seguir o en una interfaz, mientras que la implementación de JPA de Hibernate es un código que cumple con la API tal como se define en la especificación JPA y proporciona la funcionalidad bajo el capó.

Cuando utiliza Hibernate con JPA, en realidad está utilizando la implementación de Hibernate JPA. El beneficio de esto es que puede cambiar la implementación de JPA de Hibernate para otra implementación de la especificación JPA. Cuando utiliza Hibernate directamente, 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, lee mi entrada de blog .

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

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

A menudo, hay terceros que desarrollan paquetes que cumplen una función o llenan un espacio que no forma parte del JDK oficial. Por diversos motivos, esa función puede convertirse en parte del Java JDK a través del JCP (Java Community Process)

Hibernate (en 2003) proporcionó una forma de abstraer SQL y permitir a los desarrolladores pensar más en términos de objetos persistentes (ORM). Usted notifica a hibernate sobre sus objetos Entity y automáticamente genera la estrategia para persistir. Hibernate proporcionó una implementación para hacer esto y la API para impulsar la implementación a través de la configuración XML o anotaciones.

El problema fundamental ahora es que su código se combina estrechamente con un proveedor específico (Hibernate) para 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 mucha entrada de Hibernate y otros vendedores de herramientas ORM estaba desarrollando JSR 220 (Solicitud de especificación de Java) que dio como resultado JPA 1.0 (2006) y eventualmente JSR 317 que es JPA 2.0 (2009). Estas son las 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 se preocupen por el proveedor en particular que está haciendo el trabajo de persistir en 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 de ORM que cumpla con sus necesidades.

Hay casos en 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/

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

Tradicionalmente ha habido múltiples soluciones ORM de Java:

  • Hibernar
  • TopLink
  • JDO

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

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

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

Como se explica en mi libro, persistencia de Java de alto rendimiento , Hibernate ofrece características que aún no son compatibles con JPA :

  • generadores de identificadores ampliados ( hi / lo , mancomunados, agrupados-lo )
  • preparación de dosificación preparada y transparente
  • declaraciones personalizables de CRUD ( @SQLInsert , @SQLUpdate , @SQLDelete )
  • filtros de recostackción estáticos o dynamics (por ejemplo, @Filter , @Where , @Where ) y filtros de entidades (por ejemplo, @Where )
  • mapeo de propiedades a fragmentos SQL (ej. @Formula )
  • entidades inmutables (p @Immutable ej. @Immutable )
  • más modos de descarga (por ejemplo, FlushMode.ALWAYS , FlushMode.ALWAYS )
  • consultar el caché de segundo nivel por la clave natural de una entidad dada
  • estrategias de simultaneidad de caché a nivel de entidad (por ejemplo, Cache(usage = CacheConcurrencyStrategy.READ_WRITE) )
  • versiones de actualizaciones a granel a través de HQL
  • excluir campos de la comprobación de locking optimista (por ejemplo, @OptimisticLock(excluded = true) )
  • locking optimista sin versiones (por ejemplo, OptimisticLockType.DIRTY , OptimisticLockType.DIRTY )
  • soporte para omitir (sin esperar) las solicitudes de locking pesimista
  • soporte para Java 8 Fecha y hora
  • soporte para multitenancy
  • soporte para borrado suave (ej. @Where , @Filter )

Estas características adicionales permiten a Hibernate satisfacer muchos requisitos de persistencia exigidos por grandes aplicaciones empresariales.

De la Wiki .

Motivación para crear la API de Java Persistence

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

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

JPA tiene características que compensarán un marco ORM estándar. Como JPA forma parte de las especificaciones de Java EE, puede utilizar solo JPA 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 de ORM más popular. Una vez que se introdujo el JPA, hibernate cumple con las especificaciones de JPA . Además del conjunto básico de especificaciones que debe seguir, hibernate proporciona muchas cosas adicionales.

Hibernate es un proveedor de JPA.

La página JPA Vs Hibernate por Krishna Srinivasan dice:

JPA es una especificación para acceder, conservar y gestionar los datos entre los objetos Java y la base de datos relacional. Como la definición dice su API, es solo la especificación. No hay implementación para la API. JPA especifica el conjunto de reglas y directrices para desarrollar las interfaces que siguen el estándar. Directo al punto: JPA solo son pautas para implementar el Mapeo Relacional de Objetos (ORM) y no hay un código subyacente para la implementación. Donde como, Hibernate es la implementación real de las pautas de JPA. Cuando hibernate implementa la especificación JPA, esto será certificado por el grupo JPA al seguir todos los estándares mencionados en la especificación. Por ejemplo, las pautas de JPA proporcionarían información de características obligatorias y opcionales para implementarse como parte de la implementación de JPA.

JPA es solo una especificación que necesita una implementación concreta. La implementación predeterminada que oracle proporcionar 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 + MORE (Tipo de JPA Plus). Hibernate es súper conjunto de JPA con algunas funciones específicas adicionales de Hibernate. Por lo tanto, la aplicación desarrollada en Hibernate puede no ser compatible cuando se cambia a otra implementación. Todavía hibernate es la elección de la mayoría de los desarrolladores como la implementación de 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.

JPA: es como una interfaz y no tiene una implementación concreta para usar funciones que están 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á brindando un mejor rendimiento y desea cambiar el Proveedor de JPA en ese momento en que ya no tiene que escribir su JPA. Puede escribir otro Proveedor de JPA … y puede cambiar tantas veces como pueda.

Combo 2 : se usa muy poco, ya que cuando no va a cambiar su proveedor de JPA a toda costa.

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

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

JPA es una especificación para estandarizar ORM-API. Hibernate es un proveedor de una implementación de JPA. Entonces, si usa JPA con Hibernate, puede usar la API estándar de JPA, hibernate estará bajo el capó, ofreciendo algunas funciones no estándar. Ver http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/ y http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

JPA es solo una especificación. En el mercado hay muchos proveedores que implementan JPA. Diferentes tipos de proveedores implementan JPA de diferentes maneras. por lo tanto, los diferentes tipos de proveedores ofrecen diferentes funcionalidades, de modo que elija el proveedor adecuado en función de sus requisitos.

Si está utilizando Hibernate o cualquier otro proveedor en lugar de JPA, no podrá pasar fácilmente a hibernate a EclipseLink o OpenJPA a Hibernate. Pero si usa JPA, simplemente tiene que cambiar el archivo XML de persistencia. De este modo, es posible la migración en JPA.

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

Entonces, sus opciones son: hibernate, toplink, 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 una funcionalidad que la especificación JPA no admite.

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

Java: su independencia no solo proviene 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 Hibernate puede ser más fácil de implementar en un servidor de aplicaciones diferente.

JPA es una especificación que implementa en su capa de datos para realizar operabilidades de DB, O asignaciones y otras tareas requeridas.

Como es solo una especificación , necesita una herramienta para implementarla. Esa herramienta puede ser Hibernate, TopLink, iBatis, datos de spring, etc.

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

* ( si lo recuerda, import javax.persistence.*; cuando utiliza anotaciones para la asignación O (como @Id, @Column, @GeneratedValue etc.) en Hibernate, ahí es donde usa JPA bajo Hibernate, puede usar La @Query de JPA y otras características también )

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

Puede pensar en JPA como un conjunto de reglas que implementa Hibernate.

JPA es JSR, es decir, Requisito de especificación de Java para implementar Asignación relacional de objetos que no tiene un código específico para su implementación. Define cierto conjunto de reglas para acceder, mantener y administrar los datos entre los objetos Java y la base de datos relacional. Con su introducción, EJB fue reemplazado ya que fue criticado por ser un peso pesado por la comunidad de desarrolladores de Java. Hibernate es una de las formas en que JPA puede implementarse usando las pautas. Hibernate es un servicio de búsqueda y persistencia Object / Relational de alto rendimiento que está licenciado bajo la Licencia Pública General Reducida de GNU (LGPL). El beneficio de esto es que usted puede cambiar la implementación de JPA de Hibernate para otra implementación de la especificación JPA. Cuando utiliza Hibernate directamente, 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.

JPA es solo una especificación que necesita una implementación concreta. La implementación predeterminada proporcionada por Oracle es “Eclipselink” ahora. Toplink es donado por Oracle 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 + MORE. Hibernate es súper conjunto de JPA con algunas funciones específicas adicionales de Hibernate. Entonces, la aplicación desarrollada en Hibernate puede no ser compatible cuando se cambia a otra implementación. Todavía hibernate es la elección de la mayoría de los desarrolladores como la implementación de 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

Intento explicar con palabras muy sencillas.

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 statement anterior CAR (es una especificación) ya que cada automóvil tiene características comunes como una cosa con 4 ruedas y se puede conducir en la carretera es coche … así que es como JPA. Y MERCEDES, BMW, AUDI, etc. solo utilizan la característica de automóvil común 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, por esta característica común va a jpa e hibernate es solo una implementación de acuerdo a su necesidad de jboss.

1 cosa más

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 muchos dolores de cabeza y para esas propiedades básicas incluye anotaciones JPA que pueden funcionar para cualquier tecnología de implementación, consultas JPQL.

Por lo tanto, principalmente implementamos hibernación con tecnología de tipo JPA solo en caso de que deseemos cambiar nuestra implementación de acuerdo con la necesidad del cliente, además usted escribirá menos código ya que algunas características comunes están involucradas en JPA. Si alguien aún no está claro, puedes comentar como nuevo en el desbordamiento de la stack.

Gracias

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.

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

JPA es la API Java Persistence. Que especifica solo las especificaciones para las API. Significa que el conjunto de reglas y pautas 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 hacer acceso 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. Al igual que Hibernate TopLink y Open JPA, algunos ejemplos de proveedores de API JPA. Entonces usamos las API estándar especificadas por JPA a través de Hibernate.

En sentido figurado, JPA es solo una 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 de Java de alto rendimiento” de Vlad Mihalcea.