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?
Respuestas:
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 .
fuente
org.hibernate
anotación. más sobre estoJPA es el baile, Hibernate es el bailarín.
fuente
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/
fuente
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 :
@SQLInsert
,@SQLUpdate
,@SQLDelete
) declaraciones@FilterDef
. ej .@Filter
,@Where
) y filtros de entidad (p@Where
. ej. )@Formula
)@Immutable
. ej. )FlushMode.MANUAL
. ej .FlushMode.ALWAYS
)Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
. ej. )@OptimisticLock(excluded = true)
. ej. )OptimisticLockType.ALL
. ej .OptimisticLockType.DIRTY
)@Where
,@Filter
)Estas características adicionales permiten que Hibernate aborde muchos requisitos de persistencia exigidos por las grandes aplicaciones empresariales.
fuente
De la Wiki .
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.
fuente
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.
fuente
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 : 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á.
fuente
JPA es la interfaz, Hibernate es una implementación de esa interfaz.
fuente
JPA es una especificación para estandarizar ORM-API. Hibernate es un proveedor de una implementación JPA. Entonces, si usa JPA con hibernate, puede usar la API JPA estándar, hibernate estará bajo el capó, ofreciendo algunas funciones más 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/
fuente
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.
fuente
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.
fuente
Si bien JPA es la especificación, Hibernate es el proveedor de implementación que sigue las reglas dictadas en la especificación.
fuente
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.
fuente
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 )fuente
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.
fuente
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.
fuente
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
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
fuente
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.
fuente
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.
fuente
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.
fuente
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.
fuente