Quelle est la différence entre Hibernate et Spring Data JPA

207

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?

codeur dur
la source
7
@NeilStockton demandant une comparaison entre deux technologies ne demande pas d'avis.
Philip Rego

Réponses:

262

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 GenericDaoimplé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' @Transactionalannotation .

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.

Vlad Mihalcea
la source
53
Cela signifie-t-il donc que Spring Data JPA ne peut pas exister par lui-même? Autrement dit, sous le capot, il utilise l'un des fournisseurs JPA (comme Hibernate, Eclipselink ou tout autre fournisseur JPA)?
CuriousMind
Je veux dire que si j'utilise uniquement l'hibernation, il y a peu de configuration pour le niveau d'hibernation.Si j'utilise des données de printemps jpa, cela semble beaucoup plus facile que l'hibernation. En ce sens, je vous ai posé cette question.
Asif Mushtaq
1
Plus précisément, jusqu'à présent, tout fonctionne bien, il vous suffit de comprendre le niveau supérieur, c'est-à-dire Spring Data JPA. À la première exception, vous devez potentiellement connaître les niveaux inférieurs, à savoir Hibernate, JDBC et la base de données.
Marmite Bomber
138

Il y a 3 choses différentes que nous utilisons ici:

  1. JPA: API de persistance Java qui fournit des spécifications pour la persistance, la lecture et la gestion des données de votre objet java aux relations dans la base de données.
  2. Hibernate: Il existe différents fournisseurs qui implémentent jpa. Hibernate est l'un d'entre eux. Nous avons donc également un autre fournisseur. Mais si vous utilisez jpa avec spring, cela vous permettra de passer à différents fournisseurs à l'avenir.
  3. Spring Data JPA: C'est une autre couche au-dessus de jpa que le printemps fournit pour vous faciliter la vie.

Permet donc de comprendre comment les données du printemps JPA et au printemps + mise en veille prolongée ŒUVRES


Spring Data JPA:

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.

Bhagwati Malav
la source
3
Alors, quelle est l'implémentation sous-jacente de Spring Data JPA, est-elle en hibernation? parce que lorsque j'utilise PagingAndSortingRepository, elle affiche les journaux Hibernate dans la console.
Vicky
2
Spring Data JPA a utilisé l'implémentation Hibernate par défaut. Si vous voyez les dépendances transitives de spring-boot-starter-data-jpa, vous pouvez y voir hibernate-core
IamVickyAV
28

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:

  • aucun accès EntityManager dans les classes org.springframework.data.repository (c'est la classe JPA de base!)
  • gestion des transactions propres (transactions en veille prolongée non autorisées)
  • d'énormes problèmes avec plus d'une configuration de sources de données
  • aucun regroupement de sources de données (HikariCP doit être utilisé comme bibliothèque tierce)

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 :)

Klaudiusz Wojtkowiak
la source
2
Daobab, vraiment? Si vous n'aimez pas la sécurité de type de jpql (je ne l'aime pas), JPA a une API de critères de type sûr ... JPA standard est meilleur que cette mauvaise alternative.
ymajoros
8

Spring Dataest une bibliothèque de commodité en plus JPAqui 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 JPArequêtes appropriées .

Son placement au sommet de JPArend son utilisation tentante pour:

  1. Développeurs débutants qui ne le savent pas SQLou le connaissent mal. C'est une recette pour un désastre mais ils peuvent s'en tirer si le projet est trivial.

  2. 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 à Springen 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.

raiks
la source
c'est une bonne réponse, mais si vous pouviez énumérer les cas d'angle et les détailler davantage, cela serait très utile. Cela deviendra une excellente réponse. Merci
John
Eh bien, ce n'est pas si facile de se souvenir de ceux étant donné que je n'ai pas travaillé avec Spring Data depuis un bon moment - je vais devoir revoir l'ancien code et ajouter plus de commentaires. Cependant, l'un des ennuis directement de ma tête - dans JPA très souvent, les objets doivent se référencer (par exemple pour les opérations en cascade). Cela provoque une erreur de dépassement de pile (en raison de références circulaires) lorsque Spring essaie de les sérialiser, vous forçant à de vilains bidouilles / solutions de contournement. Ce problème est cependant tangentiel à Spring Data car il s'agit d'un problème JPA. Cependant, étant donné que JPA est sous-jacent à Spring Data, vous l'obtenez «gratuitement».
raiks
Modifié le message et ajouté un autre exemple.
raiks
1

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.

Thoopalliamar
la source
1

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.

GPopat
la source