J’ai un client lourd, une application java swing avec un schéma de 25 tables et ~ 15 JInternalFrames (formulaires de saisie de données pour les tables). Je dois faire un choix de conception de JDBC ou ORM (mise en veille prolongée avec un cadre de spring dans le cas présent) pour une interaction de SGBD. La création de l’application aura lieu dans le futur.
L’hibernation serait-elle exagérée pour un projet de cette taille? Une explication de la réponse par oui ou par non serait très appréciée (ou même une approche différente si nécessaire).
TIA.
Bonne question sans réponse simple.
J’ai été un grand fan d’Hibernate après l’avoir utilisé dans plusieurs projets sur plusieurs années. J’avais l’habitude de croire que tout projet devrait par défaut hibernate.
Aujourd’hui, je n’en suis pas si sûr.
Hibernate (et JPA) est idéal pour certaines choses, en particulier au début du cycle de développement. Il est beaucoup plus rapide de travailler avec Hibernate qu’avec JDBC. Vous obtenez beaucoup de fonctionnalités pour la mise en cache gratuite, le locking optimiste, etc.
Par contre, il y a des coûts cachés. Hibernate est d’une simplicité trompeuse quand vous commencez . Suivez un tutoriel, mettez des annotations sur votre classe – et vous avez de la persistance. Mais ce n’est pas simple et pour pouvoir écrire du bon code, il faut bien comprendre à la fois le fonctionnement interne et la conception de la firebase database. Si vous ne faites que commencer, vous pourriez ne pas être au courant de certains problèmes susceptibles de vous mordre plus tard, alors voici une liste incomplète.
Performance
Les performances d’exécution sont assez bonnes, je n’ai pas encore vu une situation où l’hibernation était la raison des mauvaises performances en production . Le problème est la performance de démarrage et son impact sur le temps de test des unités et les performances de développement. Lorsque l’hibernation se charge, elle parsing toutes les entités et effectue une pré-mise en cache importante. Cela peut prendre environ 5 à 10 à 15 secondes pour une application peu volumineuse. Donc, votre test unitaire d’une seconde va prendre 11 secondes maintenant. Pas drôle.
Indépendance de la firebase database
C’est très cool tant que vous n’avez pas besoin de faire des ajustements sur la firebase database.
Session en mémoire
Pour chaque transaction, Hibernate stockera un object en mémoire pour chaque ligne de firebase database qu’il “touche”. C’est une bonne optimisation lorsque vous effectuez une saisie de données simple. Si vous devez traiter beaucoup d’objects pour une raison quelconque, cela peut sérieusement affecter les performances, à moins que vous ne nettoyiez explicitement et soigneusement la session en mémoire par vous-même.
Cascades
Les cascades vous permettent de simplifier l’utilisation des graphes d’object. Par exemple, si vous avez un object racine et des enfants et que vous enregistrez l’object racine, vous pouvez configurer la mise en veille prolongée pour enregistrer également les enfants. Le problème commence lorsque votre graphe d’object devient complexe. À moins d’être extrêmement prudent et de bien comprendre ce qui se passe en interne, il est facile de tout gâcher. Et quand vous faites cela, il est très difficile de déboguer ces problèmes.
Chargement paresseux
Lazy Loading signifie que chaque fois que vous chargez un object, hibernate ne chargera pas tous les objects associés mais fournira des espaces réservés qui seront résolus dès que vous tenterez d’y accéder. Une bonne optimisation, n’est-ce pas? C’est le cas, sauf que vous devez être conscient de ce comportement, sinon vous obtiendrez des erreurs cryptiques. Google “LazyInitializationException” pour un exemple. Et faites attention à la performance. Selon l’ordre dans lequel vous chargez vos objects et votre graphe d’objects, vous pouvez appuyer sur “n + 1 sélectionne le problème”. Google pour plus d’informations.
Mises à niveau de schéma
Hibernate permet des changements de schéma simples en ne faisant que refactoriser le code Java et en redémarrant. C’est génial quand vous commencez. Mais alors vous sortez la version un. Et à moins que vous ne souhaitiez perdre vos clients, vous devez leur fournir des scripts de mise à niveau de schéma. Ce qui signifie qu’il n’est plus simple de procéder à un refactoring car toutes les modifications de schéma doivent être effectuées en SQL.
Vues et procédures stockées
Hibernate nécessite un access en écriture exclusif aux données avec lesquelles il travaille. Ce qui signifie que vous ne pouvez pas vraiment utiliser les vues, les procédures stockées et les déclencheurs, car ceux-ci peuvent entraîner des modifications des données lorsque Hibernate ne les connaît pas. Vous pouvez avoir des processus externes écrivant des données dans la firebase database dans une transaction distincte. Mais si vous le faites, votre cache aura des données non valides. Ce qui est une autre chose à prendre en compte.
Sessions Single Threaded
Les sessions Hibernate sont à un seul thread. Tout object chargé dans une session ne peut être accédé (y compris la lecture) qu’à partir du même thread. Ceci est acceptable pour les applications côté serveur mais peut compliquer les choses si vous faites une application basée sur une interface graphique.
Je suppose que mon point est qu’il n’y a pas de repas gratuits.
Hibernate est un bon outil, mais c’est un outil complexe qui demande du temps pour bien le comprendre. Si vous ou les membres de votre équipe ne disposez pas de telles connaissances, il peut être plus simple et plus rapide d’utiliser JDBC (ou Spring JDBC) pur pour une seule application. D’un autre côté, si vous souhaitez investir du temps dans l’apprentissage (y compris l’apprentissage par la pratique et le débogage), vous serez en mesure de mieux comprendre les compromis.
Hibernate peut être une bonne chose, mais les autres ORM JPA ont tendance à dicter la structure de votre firebase database. Par exemple, les clés primaires composites peuvent être effectuées dans Hibernate / JPA, mais elles sont un peu délicates. Il y a d’autres exemples.
Si vous êtes à l’aise avec SQL, je vous suggère fortement de consulter Ibatis . Il peut faire plus de 90% de ce que Hibernate peut faire, mais son implémentation est beaucoup plus simple.
Je ne peux pas penser à une seule raison pour laquelle je choisirais directement JDBC (ou même Spring JDBC) sur Ibatis. Hibernate est un choix plus complexe.
Jetez un coup d’œil au tutoriel de spring et d’Ibatis .
Hibernate a sans doute sa complexité.
Mais ce que j’aime beaucoup avec l’approche d’Hibernate (d’autres aussi), c’est que le modèle conceptuel que vous pouvez obtenir en Java est meilleur. Bien que je ne considère pas OO comme une panacée et que je ne recherche pas la pureté théorique du design, j’ai trouvé tellement de fois que OO simplifie en fait mon code. Comme vous l’avez demandé spécifiquement pour les détails, voici quelques exemples:
la complexité supplémentaire n’est pas dans le modèle et les entités, mais dans votre cadre pour manipuler toutes les entités par exemple. Pour les responsables, la partie difficile n’est pas constituée par quelques classes de framework mais par votre modèle, Hibernate vous permet donc de garder la partie dure (le modèle) la plus propre possible.
Si un champ (comme un identifiant ou des champs d’audit, etc.) est utilisé dans toutes vos entités, vous pouvez créer une super – classe avec celui-ci. Donc :
Hibernate possède également de nombreuses fonctionnalités pour gérer les autres caractéristiques du modèle dont vous pourriez avoir besoin (maintenant ou ultérieurement, ajoutez-les uniquement si nécessaire). Prenez-le comme une qualité d’ extensibilité pour votre conception.
Avec la réutilisation entre vos entités (mais uniquement l’inheritance et la composition appropriés ), il y a généralement des avantages supplémentaires à venir. Exemples :
Au fil du temps, les exigences évoluent. Il y aura un point où votre structure de firebase database aura des problèmes. Avec JDBC seul, toute modification apscope à la firebase database doit avoir un impact sur le code (par exemple, le coût double). Avec Hibernate, de nombreux changements peuvent être absorbés en modifiant uniquement le mappage, pas le code. La même chose se produit dans l’autre sens: Hibernate vous permet de modifier votre code (entre les versions par exemple) sans modifier votre firebase database (en modifiant le mappage, bien que cela ne soit pas toujours suffisant). En résumé, Hibernate vous permet de faire évoluer votre firebase database et votre code de manière indépendante .
Pour toutes ces raisons, je choisirais Hibernate 🙂
Je pense que l’un ou l’autre est un bon choix, mais personnellement, j’utiliserais l’hibernation. Je ne pense pas que la mise en veille prolongée soit exagérée pour un projet de cette taille.
Là où Hibernate brille vraiment pour moi, ce sont les relations entre entités / tables. Faire JDBC à la main peut prendre beaucoup de code si vous traitez en même temps avec des parents et des enfants (petits-enfants, frères et soeurs, etc.). Hibernate peut être un jeu d’enfant (souvent une seule sauvegarde de l’entité parent suffit).
Il y a certes des complexités lorsque l’on traite d’Hibernate, comme comprendre le fonctionnement de la session et gérer le chargement paresseux.
Straight JDBC conviendrait au mieux aux cas les plus simples.
Si vous souhaitez restr dans Java et OOD, choisissez Hibernate ou Hibernate / JPA ou tout autre fournisseur JPA / JPA.
Si vous êtes plus à l’aise avec SQL, il ne sera pas difficile d’avoir des modèles Spring pour JDBC et d’autres frameworks orientés SQL.
En revanche, outre le contrôle transactionnel, il n’ya guère d’aide à avoir Spring lorsqu’il travaille avec JPA.
Hibernate convient parfaitement aux applications middleware. Supposons que nous construisions un middleware au-dessus de la firebase database. Le middelware est accessible par une vingtaine d’applications dans ce cas, nous pouvons avoir une mise en veille prolongée qui répond aux exigences des 20 applications.
Dans JDBC, si nous ouvrons une connexion à une firebase database, nous devons écrire dans try, et si des exceptions se produisent, catch block le prendra en compte et finira par fermer les connexions.
Dans jdbc, toutes les exceptions sont vérifiées, donc nous devons écrire du code dans try, catch et throws, mais dans hibernate, nous avons uniquement des exceptions non vérifiées.
Ici, en tant que programmeur, nous devons fermer la connexion ou nous pouvons avoir une chance de recevoir notre message de connexion…!
En fait, si nous ne fermions pas la connexion dans le bloc finally, jdbc ne serait pas responsable de fermer cette connexion.
Dans JDBC, nous devons écrire des commandes Sql à différents endroits, une fois que le programme a été créé si la structure de la table est modifiée, le programme JDBC ne fonctionnera plus, nous devrons modifier, comstackr et redéployer, ce qui est fastidieux.
JDBC utilisé pour générer des codes d’erreur liés à la firebase database si une exception se produit, mais les programmeurs Java sont inconnus à propos de ces codes d’erreur corrects.
Pendant que nous insérons un enregistrement, si nous n’avons pas de table particulière dans la firebase database, JDBC augmentera une erreur telle que «Afficher pas existé» et lève une exception, mais en cas de mise en veille prolongée, si aucune table n’a été trouvée. firebase database cela va créer la table pour nous
Prise en charge de JDBC Chargement de LAZY et prise en charge d’Hibernate Chargement de l’utilisateur
Hibernate soutient l’inheritance, les associations, les collections
En hibernate, si nous sauvegardons l’object de classe dérivé, alors son object de classe de base sera également stocké dans la firebase database, cela signifie que l’hibernation prend en charge l’inheritance
Hibernate prend en charge les relations telles que le one-to-many, le one-to-one, le plusieurs-à-plusieurs et le plusieurs-à-un
Hibernate prend en charge le mécanisme de mise en cache par ceci, le nombre d’allers-retours entre une application et la firebase database sera réduit. En utilisant cette technique de mise en cache, les performances de l’application seront automatiquement augmentées.
Obtenir la pagination en hibernation est assez simple.
Hibernate a la capacité de générer automatiquement des clés primaires pendant que nous stockons les enregistrements dans la firebase database
… Session en mémoire … LazyInitializationException …
Vous pourriez regarder Eboy ORM qui n’utilise pas d’objects de session … et où le chargement paresseux ne fonctionne que. Certainement une option, pas exagérée, et sera plus simple à comprendre.
si des milliards d’utilisateurs utilisant l’application ou le web alors en jdbc query s’exécutent des milliards de fois, mais en hibernation, la requête ne sera exécutée qu’une seule fois pour n’importe quel nombre de plus important et simple avantage d’hibernation sur jdbc.