Quelles sont les principales différences entre Hibernate et Spring Data JPA? Quand ne devrions-nous pas utiliser Hibernate ou Spring Data JPA? De plus, quand le modèle Spring JDBC peut-il être plus performant que Hibernate / Spring Data JPA?
Quelles sont les principales différences entre Hibernate et Spring Data JPA? Quand ne devrions-nous pas utiliser Hibernate ou Spring Data JPA? De plus, quand le modèle Spring JDBC peut-il être plus performant que Hibernate / Spring Data JPA?
Réponses:
Hibernate est une implémentation JPA, tandis que Spring Data JPA est une abstraction d'accès aux données JPA. Spring Data JPA ne peut pas fonctionner sans fournisseur JPA.
Spring Data offre une solution au modèle DDDRepository
ou aux GenericDao
implémentations personnalisées héritées . Il peut également générer des requêtes JPA en votre nom via des conventions de nom de méthode.
Avec Spring Data, vous pouvez utiliser Hibernate, Eclipse Link ou tout autre fournisseur JPA. Un avantage très intéressant de l'utilisation de Spring ou Java EE est que vous pouvez contrôler les limites de transaction de manière déclarative à l'aide de l' @Transactional
annotation .
Spring JDBC est beaucoup plus léger, et il est destiné aux requêtes natives, et si vous avez uniquement l'intention d'utiliser JDBC seul, il vaut mieux utiliser Spring JDBC pour gérer la verbosité JDBC.
Par conséquent, Hibernate et Spring Data sont complémentaires plutôt que concurrents.
Il y a 3 choses différentes que nous utilisons ici:
Permet donc de comprendre comment les données du printemps JPA et au printemps + mise en veille prolongée ŒUVRES
Supposons que vous utilisez spring + hibernate pour votre application. Vous devez maintenant avoir une interface et une implémentation dao où vous écrirez l'opération crud en utilisant SessionFactory de hibernate. Supposons que vous écrivez la classe dao pour la classe Employee, demain dans votre application, vous devrez peut-être écrire une opération crud similaire pour toute autre entité. Il y a donc beaucoup de code passe-partout que nous pouvons voir ici.
Maintenant, les données Spring de jpa nous permettent de définir des interfaces dao en étendant ses référentiels (crudrepository, jparepository) afin de vous fournir une implémentation dao au moment de l'exécution. Vous n'avez plus besoin d'écrire l'implémentation de Dao, c'est ainsi que Spring Data JPA vous facilite la vie.
Je ne suis pas d'accord que SpringJPA facilite la vie. Oui, il fournit des classes et vous pouvez faire du DAO simple rapidement, mais en fait, c'est tout ce que vous pouvez faire. Si vous voulez faire quelque chose de plus que findById () ou enregistrer, vous devez passer par l'enfer:
Pourquoi la gestion des transactions propres est un inconvénient? Étant donné que Java 1.8 autorise les méthodes par défaut dans les interfaces, les transactions basées sur des annotations Spring, simple ne fonctionne pas.
Malheureusement, SpringJPA est basé sur des réflexions, et parfois vous devez pointer un nom de méthode ou un package d'entité dans des annotations (!). C'est pourquoi tout refactoring fait un gros crash. Malheureusement, @Transactional ne fonctionne que pour DS principal :( Donc, si vous avez plusieurs DataSources, n'oubliez pas - les transactions ne fonctionnent que pour le principal :) :)
Quelles sont les principales différences entre Hibernate et Spring Data JPA?
Hibernate est compatible JPA, SpringJPA Spring compatibile. Votre HibernateJPA DAO peut être utilisé avec JavaEE ou Hibernate Standalone, lorsque SpringJPA peut être utilisé dans Spring - SpringBoot par exemple
Quand ne devrions-nous pas utiliser Hibernate ou Spring Data JPA? De plus, quand le modèle Spring JDBC peut-il être plus performant que Hibernate / Spring Data JPA?
Utilisez Spring JDBC uniquement lorsque vous devez utiliser beaucoup de jointures ou lorsque vous devez utiliser Spring avec plusieurs connexions de source de données. En règle générale, évitez JPA pour les jointures.
Mais mon conseil général, utilisez une nouvelle solution — Daobab ( http://www.daobab.io ). Daobab est mon intégrateur Java et tout moteur JPA, et je crois que cela vous aidera beaucoup dans vos tâches :)
Spring Data
est une bibliothèque de commodité en plus JPA
qui résume beaucoup de choses et apporte la magie de Spring (que cela plaise ou non) à l'accès au magasin de persistance. Il est principalement utilisé pour travailler avec des bases de données relationnelles. En bref, il vous permet de déclarer des interfaces qui ont des méthodes comme findByNameOrderByAge(String name);
celle-ci qui seront analysées lors de l'exécution et converties en JPA
requêtes appropriées .
Son placement au sommet de JPA
rend son utilisation tentante pour:
Développeurs débutants qui ne le savent pas SQL
ou le connaissent mal. C'est une recette pour un désastre mais ils peuvent s'en tirer si le projet est trivial.
Des ingénieurs expérimentés qui savent ce qu'ils font et veulent accélérer les choses. Cela pourrait être une stratégie viable (mais lisez plus loin).
D'après mon expérience avec Spring Data
, sa magie est trop (cela s'applique à Spring
en général). J'ai commencé à l'utiliser massivement dans un projet et j'ai finalement rencontré plusieurs cas de coin où je ne pouvais pas sortir la bibliothèque de mon chemin et je me suis retrouvé avec des solutions de contournement moches. Plus tard, j'ai lu les plaintes des autres utilisateurs et j'ai réalisé que ces problèmes sont typiques de Spring Data
. Par exemple, vérifiez ce problème qui a conduit à des heures d'enquête / de prestation de serment:
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());
}
J'ai fini par descendre au niveau inférieur et j'ai commencé à utiliser JDBI
- une belle bibliothèque avec juste assez de "magie" pour vous sauver du passe-partout. Avec lui, vous avez un contrôle total sur les requêtes SQL et vous n'avez presque jamais à combattre la bibliothèque.
Hibernate est l'implémentation de "JPA" qui est une spécification pour les objets Java dans la base de données.
Je recommanderais d'utiliser wrt JPA car vous pouvez basculer entre différents ORMS.
Lorsque vous utilisez JDBC, vous devez utiliser des requêtes SQL, donc si vous maîtrisez SQL, optez pour JDBC.
Si vous préférez la simplicité et plus de contrôle sur les requêtes SQL, je vous suggère d'utiliser Spring Data / Spring JDBC.
Sa bonne quantité de courbe d'apprentissage dans JPA et parfois des problèmes difficiles à déboguer. D'un autre côté, bien que vous ayez un contrôle total sur SQL, il devient beaucoup plus facile d'optimiser les requêtes et d'améliorer les performances. Vous pouvez facilement partager votre SQL avec DBA ou quelqu'un qui a une meilleure compréhension de la base de données.