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

8 minutos de lectura

avatar de usuario
codificador duro

¿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 funcionar mejor la plantilla Spring JDBC que Hibernate/Spring Data JPA?

  • @NeilStockton pedir una comparación entre dos tecnologías no es pedir opiniones.

    – Felipe Rego

    16 de febrero de 2018 a las 6:03

avatar de usuario
Vlad Mihalcea

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

Spring Data ofrece una solución a la DDD Repository patrón o el legado GenericDao implementaciones personalizadas. 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, EclipseLink o cualquier otro proveedor de JPA. Un beneficio muy interesante de usar Spring o Java EE es que puede controlar los límites de las transacciones de forma declarativa usando el @Transactional anotación.

Spring JDBC es mucho más liviano y está diseñado para consultas nativas, y si solo tiene la intención de usar JDBC solo, es mejor que use Spring JDBC para lidiar con la verbosidad de JDBC.

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

  • Entonces, ¿significa esto 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)?

    – Mente curiosa

    3 mayo 2016 a las 19:17

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

    -Asif Mushtaq

    14 oct 2018 a las 10:56

  • Más precisamente, hasta ahora todo funciona bien, solo necesita comprender el nivel superior, es decir, Spring Data JPA. Con la primera excepción, potencialmente debe conocer los niveles más bajos, es decir, Hibernate, JDBC y la base de datos.

    – Bombardero Marmite

    13 de agosto de 2019 a las 16:26

  • @CuriousMind No, Spring Data no existe (funciona) de forma independiente. Utiliza la implementación de Hibernate por defecto, puedes notar hibernate-core como uno de los niños deps en spring-data-jpa

    – CᴴᴀZ

    21 de junio de 2021 a las 7:32

  • Todos los que están leyendo esto de la clase MWT: MÄÄÄHH

    – Prueba

    12 de enero a las 14:46

avatar de usuario
Bhagawati Malav

Hay 3 cosas diferentes que estamos usando aquí:

  1. JPA: API de persistencia de Java que proporciona especificaciones para persistir, leer y administrar datos de su objeto Java a las relaciones en la base de datos.
  2. Hibernate: hay varios proveedores que implementan jpa. Hibernar es uno de ellos. Así que 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 además de jpa que Spring proporciona para facilitarle la vida.

Así que entendamos cómo datos de primavera jpa y primavera + hibernación obras-


JPA de datos de primavera:

Digamos que está utilizando Spring + Hibernate para su aplicación. Ahora necesita tener una interfaz e implementación de dao en la que escribirá una operación cruda utilizando SessionFactory de hibernate. Digamos que está escribiendo la clase dao para la clase Empleado, mañana en su aplicación podría necesitar escribir una operación crud similar para cualquier otra entidad. Entonces, hay mucho código repetitivo que podemos ver aquí.

Ahora Spring data jpa nos permite definir interfaces dao al extender 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 le facilita la vida.

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

    – Vikki

    31 de diciembre de 2018 a las 4:28

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

    – SoyVickyAV

    18 de octubre de 2019 a las 6:35

avatar de usuario
Klaudiusz Wojtkowiak

No estoy de acuerdo SpringJPA facilita la vida. Sí, proporciona algunas clases y puedes hacer algunos DAO simples rápidamente, pero de hecho, es todo lo que puedes 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 JPA básica!)
  • propia gestión de transacciones (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 propias es una desventaja? Dado que Java 1.8 permite métodos predeterminados en las interfaces, las transacciones basadas en anotaciones de Spring, lo simple no funciona.

Desafortunadamente, SpringJPA se basa en reflexiones y, a veces, es necesario señalar un nombre de método o un paquete de entidades en las anotaciones (!). Es por eso que cualquier refactorización hace un gran accidente. Lamentablemente, @Transactional funciona solo para DS principal 🙁 Por lo tanto, si tiene más de un origen de datos, recuerde: las transacciones funcionan solo para el principal 🙂

¿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 funcionar mejor la plantilla Spring JDBC que Hibernate/Spring Data JPA?

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

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

  • ¿De verdad? Si no le gusta la seguridad de tipo de jpql (no me gusta), JPA tiene una API de criterios de seguridad de tipo… JPA estándar es mejor que esa pobre alternativa.

    – ymajoros

    25 de enero de 2019 a las 10:31


avatar de usuario
raiks

Spring Data es una biblioteca de conveniencia en la parte superior de JPA que 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); que se analizará en tiempo de ejecución y se convertirá en apropiado JPA consultas

Su colocación encima de JPA hace que su uso sea tentador para:

  1. Desarrolladores novatos que no saben SQL o lo sabe 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 lea más).

De mi experiencia con Spring Datasu magia es demasiada (esto es aplicable a Spring en general). Empecé a usarlo mucho en un proyecto y, finalmente, encontré varios casos en los que no podía 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 de Spring Data. Por ejemplo, marque este problema que condujo a horas de investigación/juramentos:

 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é bajando el nivel y comencé a usar JDBI – una buena biblioteca con la “magia” suficiente para salvarte del repetitivo. Con él, tiene control total sobre las consultas SQL y casi nunca tiene que luchar contra la biblioteca.

avatar de usuario
GPopat

Si prefiere la simplicidad y más control sobre las consultas SQL, le sugiero que opte por 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, se vuelve mucho más fácil optimizar las consultas y mejorar el rendimiento. Puede compartir fácilmente su SQL con DBA o alguien que tenga una mejor comprensión de la base de datos.

avatar de usuario
Muhammad Waqas Dilawar

Hibernate es una 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, entonces necesita usar consultas SQL, por lo que si domina SQL, entonces vaya a JDBC.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad