¿Cuál es la diferencia entre Hibernate y Spring Data JPA?


207

¿Cuáles son las principales diferencias entre Hibernate y Spring Data JPA? ¿Cuándo no debemos usar Hibernate o Spring Data JPA? Además, ¿cuándo puede la plantilla Spring JDBC funcionar mejor que Hibernate / Spring Data JPA?


77
@NeilStockton preguntando por una comparación entre dos tecnologías no pide opiniones.
Philip Rego

Respuestas:


262

Hibernate es una implementación JPA, mientras que Spring Data JPA es una abstracción de acceso a datos JPA. Spring Data JPA no puede funcionar sin un proveedor de JPA.

Spring Data ofrece una solución para el patrón DDDRepository o las GenericDaoimplementaciones personalizadas heredadas . También puede generar consultas JPA en su nombre a través de convenciones de nombres de métodos.

Con Spring Data, puede usar Hibernate, Eclipse Link o cualquier otro proveedor de JPA. Una ventaja muy interesante de usar Spring o Java EE es que puede controlar los límites de transacción declarativamente usando la @Transactionalanotación .

Spring JDBC es mucho más liviano, y está destinado a consultas nativas, y si solo tiene la intención de usar JDBC solo, entonces es mejor usar Spring JDBC para lidiar con la verbosidad JDBC.

Por lo tanto, Hibernate y Spring Data son complementarios en lugar de competidores.


53
Entonces, ¿esto significa que Spring Data JPA no puede existir por sí mismo? Es decir, bajo el capó, ¿utiliza uno de los proveedores de JPA (como Hibernate, Eclipselink o cualquier otro proveedor de JPA)?
CuriousMind

Quiero decir que si solo uso hibernación, hay poca configuración para el nivel de hibernación. Si uso spring data jpa, eso parece mucho más fácil que hibernar. En este sentido, te hice esa pregunta.
Asif Mushtaq

1
Más precisamente, hasta ahora todo funciona bien, solo necesita comprender el nivel superior, es decir, Spring Data JPA. Con la primera excepción, posiblemente tenga que conocer los niveles inferiores, es decir, Hibernate, JDBC y la base de datos.
Marmite Bomber

138

Hay 3 cosas diferentes que estamos usando aquí:

  1. JPA: API de persistencia de Java que proporciona especificaciones para persistir, leer y administrar datos desde su objeto java a las relaciones en la base de datos.
  2. Hibernate: Hay varios proveedores que implementan jpa. Hibernate es uno de ellos. Entonces tenemos otro proveedor también. Pero si usa jpa con spring le permite cambiar a diferentes proveedores en el futuro.
  3. Spring Data JPA: esta es otra capa encima de jpa que Spring proporciona para facilitarle la vida.

Por lo tanto permite comprender cómo JPA datos de resorte y el resorte + hibernación obras-


Spring Data JPA:

Supongamos que está utilizando spring + hibernate para su aplicación. Ahora necesita tener una interfaz dao y una implementación en la que escribirá operaciones crudas usando SessionFactory of hibernate. Supongamos que está escribiendo la clase dao para la clase Empleado, mañana en su aplicación es posible que necesite escribir una operación similar para cualquier otra entidad. Así que hay mucho código repetitivo que podemos ver aquí.

Ahora Spring data jpa nos permite definir interfaces dao extendiendo sus repositorios (crudrepository, jparepository) para que le proporcione la implementación de dao en tiempo de ejecución. Ya no necesita escribir la implementación de dao. Así es como spring data jpa hace su vida más fácil.


3
Entonces, ¿cuál es la implementación subyacente de Spring Data JPA? ¿Es hibernación? Porque cuando uso PagingAndSortingRepository, muestra registros de Hibernate en la consola.
Vicky

2
Spring Data JPA usó la implementación de Hibernate por defecto. Si ve las dependencias transitivas de spring-boot-starter-data-jpa, puede ver hibernate-core allí
IamVickyAV

28

No estoy de acuerdo SpringJPA hace la vida fácil. Sí, proporciona algunas clases y puede hacer un DAO simple rápidamente, pero de hecho, es todo lo que puede hacer. Si quieres hacer algo más que findById () o guardar, debes pasar por el infierno:

  • sin acceso a EntityManager en las clases org.springframework.data.repository (¡esta es la clase básica de JPA!)
  • gestión de transacciones propia (transacciones de hibernación no permitidas)
  • Grandes problemas con más de una configuración de fuentes de datos
  • sin agrupación de fuentes de datos (HikariCP debe estar en uso como biblioteca de terceros)

¿Por qué la gestión de transacciones propia es una desventaja? Como Java 1.8 permite métodos predeterminados en las interfaces, las transacciones basadas en anotaciones de Spring, simple, no funcionan.

Desafortunadamente, SpringJPA se basa en reflexiones y, a veces, debe apuntar un nombre de método o paquete de entidad en anotaciones (!). Es por eso que cualquier refactorización hace un gran accidente. Lamentablemente, @Transactional funciona solo para DS primario :( Entonces, si tiene más de un DataSources, recuerde: las transacciones funcionan solo para el primario :)

¿Cuáles son las principales diferencias entre Hibernate y Spring Data JPA?

Hibernate es compatible con JPA, SpringJPA compatible con Spring. Su HibernateJPA DAO se puede usar con JavaEE o Hibernate Standalone, cuando SpringJPA se puede usar dentro de Spring - SpringBoot por ejemplo

¿Cuándo no debemos usar Hibernate o Spring Data JPA? Además, ¿cuándo puede la plantilla Spring JDBC funcionar mejor que Hibernate / Spring Data JPA?

Use Spring JDBC solo cuando necesite usar muchas Uniones o cuando necesite usar Spring con múltiples conexiones de origen de datos. En general, evite JPA para las uniones.

Pero mi consejo general es utilizar una solución nueva: Daobab ( http://www.daobab.io ). Daobab es mi Java y cualquier integrador de motores JPA, y creo que ayudará mucho en sus tareas :)


2
Daobab, ¿en serio? Si no le gusta la seguridad de tipo de jpql (no me gusta), JPA tiene una API de criterios de tipo seguro ... El JPA estándar es mejor que esa mala alternativa.
ymajoros

8

Spring Dataes una biblioteca de conveniencia además de JPAque abstrae muchas cosas y trae la magia de Spring (nos guste o no) al acceso a la tienda de persistencia. Se utiliza principalmente para trabajar con bases de datos relacionales. En resumen, le permite declarar interfaces que tienen métodos como findByNameOrderByAge(String name);ese se analizarán en tiempo de ejecución y se convertirán en JPAconsultas apropiadas .

Su ubicación encima JPAhace que su uso sea tentador para:

  1. Desarrolladores novatos que no lo saben SQLo lo saben mal. Esta es una receta para el desastre, pero pueden salirse con la suya si el proyecto es trivial.

  2. Ingenieros experimentados que saben lo que hacen y quieren acelerar las cosas rápidamente. Esta podría ser una estrategia viable (pero sigue leyendo).

Desde mi experiencia con Spring Data, su magia es demasiado (esto es aplicable Springen general). Comencé a usarlo en gran medida en un proyecto y finalmente llegué a varios casos en los que no pude sacar la biblioteca de mi camino y terminé con soluciones feas. Más tarde leí las quejas de otros usuarios y me di cuenta de que estos problemas son típicos Spring Data. Por ejemplo, verifique este problema que llevó a horas de investigación / juramento:

 public TourAccommodationRate createTourAccommodationRate(
        @RequestBody TourAccommodationRate tourAccommodationRate
    ) {
        if (tourAccommodationRate.getId() != null) {
            throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
        }

        // This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
        // when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
        // information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
        // code creating the corresponding slim model. By detaching the entity from the persistence context we
        // force the ORM to re-fetch it from the database instead of taking it from the cache

        tourAccommodationRateRepository.save(tourAccommodationRate);
        entityManager.detach(tourAccommodationRate);
        return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
    }

Terminé yendo a un nivel inferior y comencé a usar JDBI: una biblioteca agradable con suficiente "magia" para salvarte de la repetitiva. Con él, tiene un control completo sobre las consultas SQL y casi nunca tiene que luchar contra la biblioteca.


esta es una buena respuesta, pero si pudiera enumerar los casos de esquina y detallarlo más, sería muy útil. Se convertirá en una gran respuesta. Gracias
John

Bueno, no es tan fácil recordar aquellos dados que no he trabajado con Spring Data durante bastante tiempo, tendré que revisar el código anterior y agregaré más comentarios. Sin embargo, una de las molestias directamente de mi cabeza: en JPA, los objetos a menudo tienen que referirse entre sí (por ejemplo, para operaciones en cascada). Esto ocasiona un error de desbordamiento de pila (debido a referencias circulares) cuando Spring intenta serializarlos, lo que lo obliga a buscar y solucionar problemas. Sin embargo, este problema es tangencial a Spring Data porque es un problema de JPA. Sin embargo, dado que JPA está subyacente a Spring Data, lo obtienes "gratis".
Raiks

Editó la publicación y agregó un ejemplo más.
Raiks

1

Hibernate es la implementación de "JPA", que es una especificación para objetos Java en la base de datos.

Recomendaría usar wrt JPA, ya que puede cambiar entre diferentes ORMS.

Cuando usa JDBC, debe usar consultas SQL, por lo que si es experto en SQL, vaya a JDBC.


1

Si prefiere simplicidad y más control sobre las consultas SQL, le sugiero que elija Spring Data / Spring JDBC.

Su buena cantidad de curva de aprendizaje en JPA y, a veces, problemas difíciles de depurar. Por otro lado, si bien tiene control total sobre SQL, resulta mucho más fácil optimizar la consulta y mejorar el rendimiento. Puede compartir fácilmente su SQL con DBA o con alguien que comprenda mejor la base de datos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.