manytomany example etiquetas ejemplo curso consultas java eclipse jpa eclipselink

example - jpa java ejemplo



¿Qué es una implementación de JPA? (5)

Es lo mismo que Java, tiene una especificación (Java SE, Java EE) e implementación, la mayoría de las personas usa la implementación de referencia (por Sun / Oracle) que es un modelo para que otros puedan hacer su propia implementación "mejor" y "avanzada" de la especificación (API, Interfaces y documentación / JavaDoc si necesita una definición de una palabra, aunque es mucho más que eso)

Entonces, lo más probable es que el Java / JDK que está usando sea solo una implementación (que es muy popular). Hay muchas más implementaciones, algunas tienen más opciones de configuración de recolección de basura, algunas dicen que son más rápidas y otras simplemente no valen la pena.

Así que la implementación básicamente hace todo, tiene el código, donde el JPA es una API (implícita por su nombre, Java Persistance API), por ejemplo, una vez más, más sobre interfaces y documentación que la implementación real de la interfaz.

Piense en ello como la clase absoluta que la implementación de JPA de Hibernate / EclipseLink extiende / implementa

Con respecto a JPA, a diferencia de Hibernate, que tiene una implementación única, la idea es desacoplar la interfaz de la implementación, de modo que la "mejor" implementación gane y todos puedan participar en el juego, no solo el creador de la interfaz.

Esto permite, por ejemplo, que Google App Engine soporte JPA, ya que solo necesita seguir una API (DataNucleus es la implementación) si tiene que usar Hibernate, habría requerido modificar la versión de Hiberanate para soportar el formato Big Table de Google (el el hecho de que JPA en GAE no es tan bueno es otra historia)

Estoy empezando con JPA, y estoy confundido en cuanto a lo que hace exactamente la implementación de JPA (EclipseLink, TopLink, Hibernate, etc.).

Comprendo el rol teórico de JPA, pero ¿cuál es el propósito de las diversas implementaciones? ¿Existen diferencias significativas entre estas opciones, como con, por ejemplo, los conectores / controladores DB? ¿Cuál es el mejor para un principiante?

Probablemente vaya con EclipseLink porque eso es lo que usa la mayoría de la literatura que he leído.


JPA en sí mismo es solo una especificación, no un producto; no puede realizar persistencia ni nada por sí mismo. JPA es solo un conjunto de interfaces, y requiere una implementación. Existen implementaciones de JPA de código abierto y comercial para elegir y cualquier servidor de aplicaciones Java EE 5 debe proporcionar soporte para su uso. JPA también requiere una base de datos para persistir.


JPA es una especificación de API de Java que describe la gestión de datos relacionales en aplicaciones que utilizan Java Platform. Puede pensar en JPA como un conjunto de Reglas, y por lo tanto no puede hacer ningún trabajo concreto para usted, pero le ayuda a estandarizar su implementación.

Entonces necesitas una implementación concreta que implemente JPA (conjunto de reglas). Hibernate, OpenJPA son algunas de las implementaciones famosas de JPA.


Java Persistence API (JPA) es una especificación de interfaz de programación de aplicaciones de lenguaje de programación Java que describe la gestión de datos relacionales en aplicaciones que utilizan Java Platform, Standard Edition y Java Platform, Enterprise Edition. La API Java Persistence se originó como parte del trabajo del grupo de expertos JSR 220 del proceso comunitario de Java. JPA 2.0 fue el trabajo del JSR 317 Expert Group.

Por lo tanto, JPA proporciona un conjunto de interfaces que deben implementarse. Siempre hay implementaciones de referencia disponibles para las especificaciones del lenguaje, en este caso EclipseLink es la implementación de referencia.

Por otro lado, Hibernate implementa la especificación JPA pero también tiene su propia API nativa.

Por ejemplo :

Digamos que diseñó una especificación de Autenticación que contiene solo una interfaz:

public interface AccessAuthenticator { public boolean verifyAccess(String username,String saltedPassword); }

Ahora esta especificación contiene solo una interfaz y un único método.

Para usar esta especificación (más precisamente el método verifyAccess ()) debe tener una implementación.

Puede haber muchas implementaciones para esta especificación. por ejemplo, alguna organización puede proporcionar su implementación para la autenticación en sus propios servidores. debe tener esa implementación para conectarse al servidor de la organización (puede haber alguna API nativa involucrada).

Un aspecto más de proporcionar una especificación es que en realidad no utiliza la implementación concreta de nada, por lo que hoy dice que está usando hibernación para conectarse a su base de datos, pero mañana viene una mejor ORM que implementa especificaciones JPA, entonces todo lo que necesita hacer es cambiar la dependencia en su proyecto (en palabras simples reemplazar el archivo JAR de implementación / Editar el archivo pom).


JPA es solo una API (por lo tanto, Java Persistence API ) que requiere una implementación para su uso.

Una analogía sería usar JDBC. JDBC es una API para acceder a bases de datos, pero necesita una implementación (un archivo jar de controlador) para poder conectarse a una base de datos. Por sí solo, sin un controlador, no se puede hacer nada con una base de datos.

Con JPA, como dije, necesita una implementación, un conjunto de clases que se encuentran "debajo" de JPA, y dicha implementación hará lo que usted desee.

Su aplicación usa la API de JPA (esta redacción es un poco confusa, pero espero que entienda la idea), que luego se comunica con la implementación subyacente.

Implementaciones populares incluyen Hibernate , EclipseLink , OpenJPA y otros.

Cada uno de ellos implementa la API JPA, por lo que si usa solo JPA, cada implementación debería actuar de la misma manera.

¡Pero! La funcionalidad provista por estas implementaciones podría ir más allá de la API JPA estándar.

Si desea utilizar esta funcionalidad en particular, deberá usar una API específica del proveedor que no sea compatible con otras.

Por ejemplo, aunque JPA define la anotación @Id con las opciones de generación de ID, cuando usa Hibernate, puede usar también @org.hibernate.annotations.GenericGenerator para estrategias de generación específicas de Hibernate.

El uso de esta anotación no funcionará a menos que esté utilizando Hibernate como la implementación subyacente.

La conclusión es que JPA es el "mínimo común denominador" que implementa cada proveedor, y cada implementación puede tener algunas características más avanzadas que no son estándar.

Si desea que su aplicación sea portátil, use solo JPA. Si está seguro de que no cambiará de parecer más adelante y cambiará las implementaciones, use las funciones específicas de JPA +.