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

Resuelto Anthony asked hace 12 años • 0 respuestas

Entiendo que JPA 2 es una especificación y 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 intentando aprender Hibernate o JPA2. Cogí el libro Pro JPA2 y sigue haciendo referencia a "proveedor JPA". Por ejemplo:

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

Esto me confunde así que tengo algunas preguntas:

  • Usando solo JPA2, ¿puedo recuperar datos de la base de datos simplemente anotando mis POJO?
  • ¿Se supone que JPA2 debe usarse 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 con Hibernate solo?
  • ¿Puede recomendar un buen libro práctico sobre JPA2? "Pro JPA2" parece más una biblia y una referencia sobre JPA2 (no entra en Consultas hasta la segunda mitad del libro). ¿Existe algún libro que adopte un enfoque de problema/solución para JPA2?
Anthony avatar Mar 27 '12 07:03 Anthony
Aceptado

Como usted afirma, JPA es solo una especificación, lo que significa que no hay implementación. Puedes anotar tus clases tanto como quieras con anotaciones JPA; sin embargo, sin una implementación no sucederá nada. Piense en JPA como las pautas que se deben seguir o una interfaz, mientras que la implementación 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 interna.

Cuando usas Hibernate con JPA, en realidad estás 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 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 obtener una descripción más detallada, lea la entrada de mi blog .

Kevin Bowersox avatar Mar 27 '2012 00:03 Kevin Bowersox

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

johnm avatar Feb 03 '2014 17:02 johnm

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 forman parte del JDK oficial. Por diversos motivos esa función puede pasar a formar parte del JDK de Java 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). Notifica a Hibernate sobre sus objetos de 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 configuración XML o anotaciones.

El problema fundamental ahora es que su código se acopla 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 muchas aportaciones de Hibernate y otros proveedores de herramientas ORM estaba desarrollando JSR 220 (Solicitud de especificación de Java) que dio como resultado JPA 1.0 (2006) y, finalmente, JSR 317, que es JPA 2.0 (2009). Estas son especificaciones de una API genérica de persistencia de Java. 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 particular que está haciendo el trabajo de conservar sus objetos. Esta es sólo 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 hacia JPA y elegir cualquier proveedor de ORM compatible que se adapte a sus necesidades.

Hay casos en los que Hibernate puede ofrecerle funciones 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/

Ken Block avatar Feb 24 '2014 16:02 Ken Block

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

Tradicionalmente ha habido múltiples soluciones Java ORM:

  • Hibernar
  • Enlace superior
  • JDO

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 y creó 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ás que usar características específicas no estándar de todos modos) .

El estándar JPA ha llevado la competencia Java ORM a un nuevo nivel y esto sólo puede conducir 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 extendidos ( hi/lo , pooled, pooled-lo )
  • procesamiento por lotes de declaraciones preparadas transparentes
  • declaraciones CRUD ( @SQLInsert,, ) @SQLUpdatepersonalizables@SQLDelete
  • filtros de colección estáticos o dinámicos (p. ej @FilterDef., @Filter, @Where) y filtros de entidad (p. ej. @Where)
  • mapeo de propiedades a fragmentos de SQL (p. ej. @Formula)
  • entidades inmutables (por ejemplo @Immutable)
  • más modos de descarga (por ejemplo FlushMode.MANUAL, , FlushMode.ALWAYS)
  • consultar el caché de segundo nivel mediante la clave natural de una entidad determinada
  • estrategias de concurrencia de caché a nivel de entidad (p. ej. Cache(usage = CacheConcurrencyStrategy.READ_WRITE))
  • actualizaciones masivas versionadas a través de HQL
  • excluir campos de la verificación de bloqueo optimista (p. ej. @OptimisticLock(excluded = true))
  • bloqueo optimista sin versión (p. ej. OptimisticLockType.ALL, OptimisticLockType.DIRTY)
  • soporte para omitir (sin esperar) solicitudes de bloqueo pesimistas
  • soporte para fecha y hora de Java 8
  • soporte para multitenencia
  • soporte para eliminación temporal (p. ej. @Where, @Filter)

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

Vlad Mihalcea avatar Nov 09 '2014 07:11 Vlad Mihalcea

De la Wiki .

Motivación para crear la API de persistencia de Java

Muchos desarrolladores empresariales de Java 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 sólo se podían utilizar 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 TopLink Essentials de la versión de código abierto se han convertido en implementaciones de la API de persistencia de Java.

Como se indica en la página de JCP, el enlace de Eclipse es la implementación de referencia para JPA. Mire esta respuesta para obtener más información sobre esto.

El propio JPA 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 implementaciones para la especificación JPA.

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

ManuPK avatar Mar 27 '2012 03:03 ManuPK