¿Qué es una implementación de JPA?


Estoy empezando con JPA, y estoy confundido en cuanto a qué es exactamente la implementación de JPA(EclipseLink, TopLink, Hibernate, etc.) hacer.

Entiendo el papel teórico de JPA, pero ¿cuál es el propósito de las diversas implementaciones? ¿Hay diferencias significativas entre estas opciones, como lo hay con, por ejemplo, conectores/controladores de base de datos? ¿Cuál es el mejor para un principiante?

Probablemente voy a ir con EclipseLink porque eso es lo que la mayoría de la literatura que he leído utilizar.

Author: Manuel Drieschmanns, 2010-12-18

5 answers

JPA

JPA es solo una API (de ahí Java Persistence API) que requiere una implementación para usar.

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 he dicho, se necesita una implementación, un conjunto de clases que se encuentran "debajo" de JPA, y tal implementación servirá lo que quieras.

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

Las implementaciones populares incluyen Hibernar, EclipseLink, OpenJPA y otros.

Cada uno de ellos implementa la API de JPA, por lo que si solo utiliza JPA, todas las implementaciones deben actuar de la misma manera.

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

Si desea utilizar esta funcionalidad en particular, tendrá que utilizar la API específica del proveedor que no será compatible con otras.

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

Usar esta anotación no funcionará a menos que esté usando Hibernate como la implementación subyacente.

La parte inferior la línea es: JPA es el "mínimo común denominador" que cada proveedor implementa, 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, utilice solo JPA. Si está seguro de que no cambiará de opinión más adelante y cambiará de implementación, use las características específicas de JPA + vendor.

 76
Author: darioo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-18 08:41:54

Es lo mismo que Java, tiene una especificación (Java SE, Java EE) e implementación, la mayoría de la gente usa la implementación de referencia (Por Sun / Oracle) que es un blueprint para que otros hagan 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)

Así que lo más probable es que el Java / JDK que está utilizando sea solo una implementación (que es muy popular). Hay hay muchas más implementaciones, algunas tienen más opciones de configuración de Recolección de basura, algunas afirman ser más rápidas y algunas simplemente no vale la pena usarlas.

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

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

Respecto a JPA, a diferencia de Hibernate que tiene una sola implementación, la idea es desacoplar la interfaz de la implementación, para que gane la "mejor" implementación 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 el Lanzamiento de Hiberanate para apoyar el formato de tabla grande de Google (el hecho de que JPA en GAE no es tan grande es otra historia)

 6
Author: Eran Medan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-15 12:58:43

JPA en sí es solo una especificación, no un producto; no puede realizar persistencia o cualquier otra cosa por sí mismo. JPA es solo un conjunto de interfaces, y requiere una implementación. Hay implementaciones de código abierto y comerciales de JPA 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.

 4
Author: supercena,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-14 15:28:35

La Java Persistence API (JPA) es una especificación de interfaz de programación de aplicaciones del 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 Java Persistence API se originó como parte del trabajo del Grupo de Expertos JSR 220 del Proceso de la Comunidad Java. JPA 2.0 fue el trabajo del Grupo de Expertos JSR 317.

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

Hibernate por otro lado, 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 utilizar este 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 se utiliza la implementación concreta de cualquier cosa, por lo que hoy dicen que está utilizando hibernate para conectarse a su base de datos, pero mañana algún better mejor viene en la imagen que implementa la especificación 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).

 1
Author: Faizan Mohammad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-23 12:33:16

JPA es una especificación de la API de Java que describe la gestión de datos relacionales en aplicaciones que utilizan la Plataforma Java. Puede pensar 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.

Por lo tanto, necesita una implementación concreta que implemente JPA (conjunto de reglas). Hibernate, OpenJPA son algunas de las implementaciones famosas de JPA.

 0
Author: Badal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-12 05:00:20