java - diferencias - ¿Cuál es la diferencia entre JPA y Hibernate?
jpa java hibernate (23)
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 la 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 característica 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 recuperar datos de DB simplemente anotando mis POJO''s
- ¿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 en comparación con Hibernate solo?
- ¿Puedes recomendar un buen libro práctico de JPA2? "Pro JPA2" parece más bien una biblia y una referencia en JPA2 (no llega a Consultas hasta la última mitad del libro). ¿Hay un libro que tenga un enfoque de problema / solución para JPA2?
Intento explicarlo 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 todos los autos tienen características comunes como la de las 4 ruedas y se pueden conducir en la carretera es el auto ... así que es como JPA. Y MERCEDES, BMW, AUDI, etc., solo están utilizando la característica común de un automóvil y están agregando funcionalidad de acuerdo con su base de clientes, por lo que están implementando las especificaciones del automóvil como hibernación, iBATIS, etc.
Por lo tanto, estas características comunes van a jpa e hibernar es solo una implementación de acuerdo con su necesidad 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 de JPQL.
Por lo tanto, principalmente implementamos hibernación con tecnología de tipo JPA solo en caso de que queramos cambiar nuestra implementación según 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 si fuera nuevo en el desbordamiento de pila.
Gracias
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 espacio 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 acerca de sus objetos de Entidad y genera automáticamente la estrategia para persistir en ellos. Hibernate proporcionó una implementación para hacer esto y la API para dirigir la implementación a través de la configuración 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 cree que debería ser más genérica. De ahí la necesidad de una API de persistencia genérica.
Mientras tanto, el JCP con mucha información 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 en JSR 317 que es JPA 2.0 (2009). Estas son especificaciones de una API de persistencia de Java genérica. La API se proporciona en el JDK como un conjunto de interfaces para que sus clases puedan depender del javax.persistence y no preocuparse por el proveedor en particular que está haciendo el trabajo de persistir en sus objetos. Esto 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 hacia JPA y elegir cualquier proveedor de ORM compatible que se adapte a sus necesidades.
Hay casos en los que Hibernate puede darle características que no están codificadas en JPA. En este caso, puede elegir 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/
De la Wiki .
Motivación para crear la API de persistencia de Java
Muchos desarrolladores Java de empresas utilizan objetos persistentes ligeros proporcionados por marcos de código abierto o Objetos de acceso a datos en lugar de beans de entidad: los beans de entidad y los beans de empresa tenían una reputación de ser demasiado pesados y complicados, y uno solo podía usarlos en los 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 la versión de código abierto TopLink Essentials se han convertido en implementaciones de la API de persistencia de Java.
Como se indica en la página JCP, el enlace de Eclipse es la Implementación de referencia para JPA. Echa un vistazo a esta respuesta un poco más sobre esto.
La propia JPA tiene características que compondrá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 la JPA se introdujo, hibernate cumple con las especificaciones de la JPA . Aparte del conjunto básico de especificaciones que debe seguir, hibernación proporciona un montón de 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, persistir y administrar 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 pautas para desarrollar las interfaces que siguen el estándar. Directo al punto: JPA es solo una guía 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 que se implementarán como parte de la implementación de JPA.
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 los objetos Java y la base de datos relacional. Con su introducción, EJB fue reemplazado, ya que fue criticado por la comunidad de desarrolladores de Java. Hibernate es una de las formas en que JPA puede implementarse utilizando las pautas. Hibernate es un servicio de consulta y persistencia de objetos / relaciones de alto rendimiento que se licencia bajo la GNU Lesser General Public License (LGPL) de código abierto. La ventaja de esto es que usted puede intercambiar 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.
JPA es el baile, Hibernate es el bailarín.
JPA es la API de persistencia de Java. Que Especifica sólo las especificaciones para las API. Significa que el conjunto de reglas y directrices para la creación de las API. Si dice otro contexto, es un conjunto de estándares que proporciona la envoltura para crear esas API, que puede usarse para acceder al objeto de entidad desde la base de datos. JPA es proporcionada 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 APIs. Hibernate es un proveedor / proveedor de JPA que es responsable de implementar esas API. Al igual que Hibernate TopLink y Open JPA son algunos ejemplos de proveedores de API JPA. Por lo tanto, utilizamos API estándar especificadas por JPA a través de hibernación.
JPA es la interfaz, Hibernate es una implementación de esa interfaz.
JPA es solo una especificación que necesita 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 )
Al usar 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 de JPA completa + MÁS (tipo de JPA Plus). Hibernate es un super conjunto de JPA con algunas funciones adicionales específicas de Hibernate. Por lo tanto, la aplicación desarrollada en Hibernate puede no ser compatible cuando se cambia a otra implementación. Aún así, hibernate es la elección de la mayoría de los desarrolladores como implementación de JPA y se usa ampliamente.
Otra implementación de JPA es OpenJPA (openjpa.apache.org) que es una extensión de la implementación de Kodo.
JPA es solo una especificación que necesita 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.
Al usar 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 de JPA completa + MÁS. Hibernate es un super conjunto de JPA con algunas funciones adicionales específicas de Hibernate. Por lo tanto, la aplicación desarrollada en Hibernate puede no ser compatible cuando se cambia a otra implementación. Aún así, hibernate es la elección de la mayoría de los desarrolladores como implementación de JPA y se usa ampliamente.
Otra implementación de JPA es OpenJPA, que es una extensión de la implementación de Kodo.
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 es solo una especificación. En el mercado hay muchos proveedores que implementan JPA. Diferentes tipos de proveedores implementan JPA de manera diferente. por lo tanto, los diferentes tipos de proveedores brindan una funcionalidad diferente, así que elija un proveedor adecuado en función de sus requisitos.
Si está utilizando Hibernate o cualquier otro proveedor en lugar de JPA, no puede moverlo fácilmente para hibernar a EclipseLink o OpenJPA a Hibernate.Pero si usa JPA, entonces solo tiene que cambiar la provisión en el archivo XML de persistencia. JPA.
JPA es una API, una que implementa Hibernate. 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 el código JPA y necesita encontrar una implementación. Hibernate pasa a ser una implementación.
Así que sus opciones son las siguientes: hibernar, enlazar, etc.
La ventaja de JPA es que le permite intercambiar 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.
JPA es una especificación de la API de Java que describe la administración de datos relacionales en aplicaciones que utilizan la Plataforma Java. where as 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.
JPA es una especificación para estandarizar las API de ORM. Hibernate es un proveedor de una implementación JPA. Por lo tanto, si usa JPA con hibernación, puede usar la API estándar de JPA, la hibernación estará bajo el capó, ofreciendo algunas funciones más no estándar. Consulte 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 una especificación que implementa en su capa de datos para realizar operaciones db, asignaciones O y otras tareas requeridas.
Como solo es una especificación , necesita una herramienta para implementarla. Esa herramienta puede ser Hibernate, TopLink, iBatis, spring-data, etc.
No necesariamente requiere JPA si está usando Hibernate en su capa de datos. Pero si usa la especificación JPA para Hibernate, entonces será más fácil cambiar a otras herramientas ORM como iBatis, TopLink en el futuro, porque la especificación también es común para otros.
* ( si recuerdas, import javax.persistence.*;
cuando usas anotaciones para el mapeo OR (como @Id, @Column, @GeneratedValue, etc.) en Hibernate, ahí es donde usas JPA bajo Hibernate, puedes usar @Query de JPA y otras características también )
JPA o Java Persistence API es una especificación estándar para implementaciones de ORM, mientras que Hibernate es la implementación o marco de ORM real.
JPA, en sentido figurado, es solo una interfaz, Hibernate / TopLink - clase (es decir, implementación de una interfaz).
Debe tener implementación de interfaz para utilizar la interfaz. Pero puede usar la clase a través de la interfaz, es decir, usar Hibernate a través de la API de JPA o puede usar la implementación directamente, es decir, usar Hibernate directamente, no a través de la API de JPA pura.
Un buen libro sobre JPA es "Persistencia de Java de alto rendimiento" de Vlad Mihalcea.
Java: su independencia no es solo del sistema operativo, sino también del proveedor.
Por lo tanto, debe 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 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.
Si bien JPA es la especificación, Hibernate es el proveedor de implementación que sigue las reglas dictadas en la especificación.
JPA es la interfaz, mientras que Hibernate es la implementación.
Tradicionalmente ha habido múltiples soluciones ORM de Java:
Cada implementación define su propia definición de mapeo o API de cliente. El grupo de expertos de JPA reunió la mejor de todas estas herramientas y, por lo tanto, crearon el estándar API de persistencia de Java.
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, de todos modos, tendrá que usar características específicas no estándar) .
La JPA estándar ha llevado la competencia de 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 funciones que aún no son compatibles con JPA :
- generadores de identificador extendido ( hi/lo , agrupados, agrupados-lo )
- declaración por lotes preparada transparente
-
@SQLInsert
CRUD personalizables (@SQLInsert
,@SQLUpdate
,@SQLDelete
) - Filtros de recopilación estáticos o dinámicos (por ejemplo,
@Filter
,@Where
,@Where
) y filtros de entidades (por ejemplo,@Where
) - mapeo de propiedades a fragmentos de SQL (por ejemplo,
@Formula
) - entidades inmutables (por ejemplo,
@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 concurrencia de caché a nivel de entidad (por ejemplo,
Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
) - actualizaciones masivas versionadas a través de HQL
- excluir campos de la verificación de bloqueo optimista (por ejemplo,
@OptimisticLock(excluded = true)
) - bloqueo optimista sin versión (por ejemplo,
OptimisticLockType.DIRTY
,OptimisticLockType.DIRTY
) - Soporte para omitir (sin esperar) solicitudes de bloqueo pesimistas.
- soporte para Java 8 Fecha y Hora
- soporte para multitenidad
- soporte para la eliminación de software (por ejemplo,
@Filter
,@Filter
)
Estas características adicionales le permiten a Hibernate abordar muchos requisitos de persistencia exigidos por aplicaciones de grandes empresas.
JPA: es como una interfaz y no tiene una implementación concreta para usar las 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 disponibles 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á funcionando mejor y desea cambiar de Proveedor de JPA en ese momento que no tiene que escribir su JPA una vez más. Puede escribir otro proveedor JPA ... y puede cambiar tantas veces como pueda.
Combo 2 : se usa mucho menos que cuando no va a cambiar su proveedor de JPA a cualquier costo.
Visite http://blog-tothought.rhcloud.com//post/2 , donde su completa confusión se aclarará.
Como indica, JPA es solo una especificación, lo que significa que no hay implementación. Puede anotar sus clases tanto como desee con las anotaciones JPA, sin embargo, sin una implementación, nada sucederá. Piense en JPA como las pautas que deben seguirse o en una interfaz, mientras que la implementación JPA de Hibernate es un código que cumple con la API según lo define 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 por otra implementación de la especificación de 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 .