1.1 Mappage des classes aux tables

Après avoir appris JDBC, vous avez probablement l'impression que travailler avec une base de données à partir d'une application Java est toujours un plaisir. Et si je vous disais que tout ce travail pourrait être fait 10 fois plus facilement ?

Quel est le principal avantage du langage SQL ? C'est un langage déclaratif - il décrit ce que nous voulons obtenir et ne dit rien du tout sur la façon de le faire. Comment - c'est la préoccupation du serveur SQL.

La même approche peut être utilisée lorsque vous travaillez avec des bases de données.

Dans un monde idéal, nous pourrions simplement écrire des requêtes SQL dans la base de données et, en réponse, nous recevrons des objets Java prêts à l'emploi, ou des collections d'objets Java, si nous en demandions plusieurs.

Que puis-je dire, c'est ce que plusieurs gars ont pensé en 2000 et ont décidé d'écrire leur propre framework ORM.

ORM signifie Object-Relational Mapping et est essentiellement un mappage d'objets Java à des requêtes SQL.

Les gars ont trouvé une chose très simple - chaque table de la base de données doit correspondre à une classe dans l'application Java . Dans une application Java, on travaille avec des objets, et ces objets savent déjà se sauvegarder dans la base de données.

Il y avait trois approches pour résoudre ce problème, et elles ressemblaient à ceci :

  1. L'objet s'enregistre dans la base de données et met à jour ses champs en fonction des informations de la base de données.
  2. L'objet est capable de s'enregistrer dans la base de données, mais n'initie jamais ce cas.
  3. L'objet ne contient que des données et quelqu'un l'enregistre dans la base de données et le charge à partir de la base de données.

Initialement, la première approche dominait, puis les serveurs d'applications et les Enterprise Java Beans étaient populaires. Il y avait même toute une classe de beans appelés Persistence EJB qui pouvaient s'enregistrer eux-mêmes dans la base de données.

Mais un jour, tout a changé...

1.2 Émergence d'hiberner

En 2001, la première version du framework Hibernate est sortie. C'était un cadre très simple, mais il permettait l'utilisation d'"objets stupides" ordinaires qui ne savaient rien de la façon dont ils devaient être stockés dans la base de données ou chargés à partir de là.

Le mappage des champs des classes Java et des colonnes dans une table de la base de données a été défini à l'aide d'un fichier XML. Et parfois, ils étaient assez volumineux. D'accord, de qui je me moque. C'étaient de gros canevas de code XML. Et la situation n'a été sauvée que par le fait qu'il y a 20 ans, il n'y avait pas de bases de données aussi gigantesques qu'aujourd'hui.

Mais en fait, la décision la plus puissante a été de finalement séparer l'objet qui doit être enregistré dans la base de données du code qui l'y a enregistré . Cette solution n'est pas vraiment évidente. Parce que le principe d'encapsulation stipule que l'objet sait mieux comment il doit être enregistré et chargé.

Et l'approche ORM brise vraiment ce concept. La classe de données expose sa structure interne, mais il est devenu beaucoup plus facile de fonctionner avec des groupes d'objets de types différents.

Une percée majeure est survenue après la sortie de Java 5 , lorsque deux choses sont apparues dans le JDK :

  • Remarques
  • Procuration

RemarquesXML a été rapidement supplanté et il était désormais facile de spécifier tous les paramètres nécessaires pour mapper une classe Java à une table de la base de données directement dans la classe Java.

Procurationpas si perceptible pour l'utilisateur Hibernate, mais leur contribution était encore plus sérieuse. Lorsque vous demandez un objet ou des objets spécifiques à Hibernate, il vous renvoie simplement un stub (proxy) et intercepte tous les appels à ses méthodes.

Cela a permis de mettre en œuvre divers mécanismes de Lazy Loading et d'augmenter la vitesse et l'efficacité d'Hibernate à un niveau complètement astronomique pour l'époque. Hibernate n'est pas seulement devenu un standard industriel de facto - il a commencé à être traduit dans d'autres langues. Ainsi, par exemple, Framework NHibernate est apparu pour C#.

1.3 Émergence de l'APP

De facto suivi d'une reconnaissance de jure. Les développeurs du JDK ont décidé de créer une spécification sur la façon de mapper correctement les objets aux tables d'une base de données. Cette spécification est appeléeAPP- API de persistance Java.

C'est exactement la spécification. Il décrit comment tout devrait fonctionner et de quelles annotations nous avons besoin pour marquer différentes parties de la classe si nous voulons que ses objets soient enregistrés dans la base de données.

Il semble que les gars aient juste pris Hibernate comme base et en aient changé les noms de paquet. Parce que toutes les annotations qui étaient dans Hibernate ont été déplacées vers JPA presque une par une.

Aujourd'hui, Hibernate implémente entièrement l'intégralité de la spécification JPA, ainsi que certaines fonctionnalités supplémentaires qui rendent son utilisation encore plus confortable. Par conséquent, en termes de standardisation, nous pouvons dire qu'Hibernate possède deux ensembles de fonctionnalités :

  • Norme JPA
  • Hibernate Native API (fonctionnalité supplémentaire)

La documentation officielle d'Hibernate le décrit ainsi :

Mais à la fois sur la base de mon expérience et après avoir relu la documentation Hibernate, je peux dire que JPA et Hibernate API sont identiques à 95%. Ce sont juste des concepts identiques.

1.4 Maven pour l'hibernation

Depuis que j'ai tant loué Hibernate, je pense qu'il est temps de travailler un peu plus dur avec.

Premièrement, il y a un site officiel, où il n'y a qu'un tas de documentation en anglais. Elle a, bien sûr, un parti pris dans les informations de référence, et non dans la formation. Mais c'est quand même mieux que de déboguer les sources, non ? :)

Instruction:

  1. Vous ouvrez le lien .
  2. Tu la regardes longtemps.
  3. Revenons à CodeGym.
  4. Vous avez lu mes autres conférences.

Mon travail consiste à simplifier des choses complexes et à les expliquer en termes simples. Et si vous avez atteint ce niveau, alors je peux le faire.

Eh bien, pour commencer avec Hibernate, vous devez l'ajouter à votre pom.xml. A ce jour, la 6ème version d'Hibernate est déjà disponible, ou plutôt la 6.1.1, nous allons donc apprendre à travailler avec la dernière version.

Ajoutez simplement ces lignes à votre pom.xml :


<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

Si vous lisez cette conférence en dehors de la fenêtre de 2023+, la nouvelle version peut être téléchargée ici .

Important! Certaines des bibliothèques utilisées par Hibernate sont obsolètes dans JDK 11 et JDK 17, donc si vous rencontrez des difficultés pour faire fonctionner votre projet, ajoutez-y ces dépendances :


  	<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
  	</dependency>
 
  	<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
  	</dependency>
 
  	<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
  	</dependency>