¿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?
¿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?
Respuestas:
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 GenericDao
implementaciones 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 @Transactional
anotació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.
Hay 3 cosas diferentes que estamos usando aquí:
Por lo tanto permite comprender cómo JPA datos de resorte y el resorte + hibernación obras-
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.
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:
¿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 :)
Spring Data
es una biblioteca de conveniencia además 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);
ese se analizarán en tiempo de ejecución y se convertirán en JPA
consultas apropiadas .
Su ubicación encima JPA
hace que su uso sea tentador para:
Desarrolladores novatos que no lo saben SQL
o lo saben mal. Esta es una receta para el desastre, pero pueden salirse con la suya si el proyecto es trivial.
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 Spring
en 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.
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.
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.