Je sors d'un grand projet utilisant Hibernate et voici les 3 faiblesses que je pense qu'Hibernate a
1. Mauvaise gestion de l'héritage des objets et aversion pour l'instrumentation
Lorsque vous chargez un objet dans Hibernate (et vous avez utilisé load pour qu'il s'agisse d'un proxy), si cet objet est en réalité (comme spécifié par la base de données) une sous-classe de celui que vous avez chargé, Hibernate ne chargera pas le type réel de l'objet. Vous l'obtiendrez en tant que proxy sur le type que vous avez demandé lorsque vous l'avez chargé (et non un proxy sur le type réel de l'objet). Donc
A a = (A) session.load("id", A.class);
Même si, dans la base de données, cet identifiant est de type B (une sous-classe de A), vous n'obtiendrez qu'un proxy de A (et non de B). Pour obtenir le vrai type, vous devez procéder à une autre étape.
La même chose se produit lorsqu'on parcourt une arborescence d'objets.
Heureusement, l'utilisation de l'instrumentation permet de résoudre le problème de l'exploration en ce sens que si un objet est instrumenté, l'exploration de l'arbre des objets permet de récupérer les types réels (sauf si l'objet est extrait d'une collection de plusieurs à plusieurs).
L'instrumentation ne résout pas l'anomalie de charge et elle existe toujours, mais l'instrumentation pourrait être utilisée pour résoudre ce problème également.
2. Sauvegarder un important nouveau modèle d'objet en une seule fois
Nous avions plusieurs processus qui généraient un grand nombre de nouveaux objets d'entité (objets persistants) et j'avais besoin de les sauvegarder. Je ne pouvais pas simplement appeler save sur l'objet source et m'attendre à ce que tout soit sauvegardé. Vous pouvez vous demander pourquoi je n'ai pas configuré la cascade pour faire cela, oui, je pourrais configurer la cascade pour l'un des cas d'utilisation, mais lorsque je lance un autre processus qui crée de nouveaux objets, cela nécessiterait sa propre structure de cascade. J'aimerais donc qu'Hibernate dispose d'une fonction permettant de sauvegarder arbitrairement un ensemble d'objets. Pour contourner ce problème, j'ai parcouru l'arbre des objets de manière réflexive en appelant la fonction de sauvegarde pour chaque objet, et j'ai dû le faire dans un ordre particulier. La fonction que je recherche ici s'appelle la persistance par accessibilité.
3. Spécifier les limites de ce que je souhaite voir préfixé, tâche par tâche
Je sais qu'avec Hibernate, il est possible de prélever une collection par le biais d'un mot-clé dans une requête, mais cela n'est souvent pas suffisant. Supposons que vous souhaitiez travailler avec un ensemble d'objets liés, vous voudriez qu'ils soient tous prérécupérés dès le départ afin d'éviter tout ralentissement et toute inefficacité par la suite. De plus, il peut y avoir plusieurs ensembles d'objets pour les différentes tâches que vous cherchez à effectuer, tous avec leur propre "profil de récupération".
Heureusement, le troisième est prévu pour la version 3.5 d'Hibernate et est connu sous le nom de "fetch profiles" (profils de récupération).