Hibernate ou JDBC
J'ai un client lourd, java swing application avec un schéma de 25 tables et ~15 JInternalFrames (formes d'entrée de données pour les tables). J'ai besoin de faire un choix de conception de la droite JDBC ou ORM (hibernate, spring framework dans ce cas) pour les SGBD interaction. Construire à partir de l'application va se produire dans l'avenir.
Serait hibernate-être exagéré pour un projet de cette taille? Une explication de oui ou non réponse serait appréciée (ou même une approche différente, si cela est justifié).
TIA.
- Il y a d'autres possibilités. Qu'en est iBATIS iBATIS.apache.org
- overkill? Conceptuel overkill ? Un autre pot ?
- Je pensais overkill dans la charge de traitement supplémentaire pour ajouter une couche supplémentaire développeur de compétences nécessaires pour le maintenir (j'ai les compétences, mais je pense quand je ne suis pas le seul à le maintenir), le couplage à une 3ème partie à la place de maternelle (bien que le supplément de pots ne sont pas un problème AFAIC). Ce type de chose.
- +1 pour une bonne remise en question de l'attitude, et la question claire
Vous devez vous connecter pour publier un commentaire.
Bonne question, sans qu'un seul de réponse simple.
J'ai utilisé pour être un grand fan de mise en veille prolongée après utilisation dans de multiples projets sur plusieurs années.
J'ai l'habitude de croire que tout projet doit par défaut de mise en veille prolongée.
Aujourd'hui, je ne suis pas si sûr.
Hibernate (et JPA) est grande pour certaines choses, surtout au début du cycle de développement.
Il est beaucoup plus rapide pour obtenir quelque chose de travailler avec Hibernate que c'est avec JDBC.
Vous obtiendrez beaucoup de fonctionnalités pour la gratuit de la mise en cache, le verrouillage optimiste et ainsi de suite.
D'autre part, il a certains coûts cachés. Hibernate est trompeusement simple lorsque vous démarrez. Suivre un tutoriel, mettre des annotations sur votre classe et vous avez vous-même la persistance. Mais ce n'est pas simple et pour être en mesure d'écrire du bon code, il faut bien comprendre les rouages internes et conception de base de données. Si vous êtes juste de commencer vous ne pouvez pas être au courant de certaines des questions qui peuvent vous mordre plus tard, voici donc une liste incomplète.
Performance
L'exécution de la performance est assez bonne, je n'ai pas encore de voir une situation où hibernate a été la raison de la piètre performance dans production. Le problème est que les performances de démarrage et comment il affecte votre tests d'unité de temps et de performance en matière de développement. Quand hibernate charges il analyse toutes les entités et fait beaucoup de pré-en cache - cela peut prendre environ 5-10-15 procès secondes pour une très grosse application. Donc, votre 1 seconde unité de test va prendre 11 secods maintenant. Pas de plaisir.
Base De Données De L'Indépendance
Il est très cool aussi longtemps que vous n'avez pas besoin de faire quelques ajustements sur la base de données.
Session en mémoire
Pour chaque transaction Hibernate va stocker un objet dans la mémoire pour chaque ligne de base de données, il "touche". C'est une belle optimisation lorsque vous faites une simple saisie de données. Si vous avez besoin de traiter un grand nombre d'objets pour quelque raison que, il peut sérieusement affecter les performances, sauf si vous explicitement et nettoyer soigneusement la session en mémoire sur votre propre.
Cascades
Cascades de vous permettre de vous simplifier le travail avec les graphes d'objets. Par exemple, si vous avez un objet racine et pour certains enfants, et vous économiser de l'objet racine, vous pouvez configurer hibernate pour sauver les enfants. Le problème commence quand votre objet graphique grandir complexe. Sauf si vous êtes extrêmement prudent et avoir une bonne compréhension de ce qui se passe en interne, il est facile de ce mess up. Et quand vous faites, il est très difficile à déboguer ces problèmes.
Chargement Paresseux
Chargement différé signifie que chaque fois que vous chargez un objet, hibernate ne prendra pas en charge tous que c'est lié à des objets, mais plutôt de fournir les détenteurs de place qui sera résolu dès que vous essayez d'y accéder. Grande optimisation de la droite? Il est, à l'exception que vous devez être au courant de ce comportement, sinon vous obtiendrez cryptique des erreurs. Google "LazyInitializationException" pour un exemple. Et être prudent avec les performances. Selon l'ordre de la façon dont vous chargez vos objets et votre objet graphique, vous pouvez frapper "n+1 selects problème". Google pour de plus amples renseignements.
Schéma De Mises À Niveau
Hibernate permet de faciliter les modifications de schéma par juste refactoring de code java et le redémarrage. Il est idéal lorsque vous démarrez. Mais alors, vous version un. Et, sauf si vous voulez perdre vos clients, vous devez leur fournir le schéma scripts de mise à niveau. Ce qui signifie pas plus simple que toutes les modifications de schéma doit être fait en SQL.
Les vues et les Procédures Stockées
Hibernate exige l'exclusivité de l'accès en écriture aux données qu'il travaille. Ce qui signifie que vous ne pouvez pas vraiment utiliser les vues, les procédures stockées et les déclencheurs comme celles-ci peuvent entraîner des modifications des données avec hibernate de ne pas les connaître. Vous pouvez avoir des processus externes de l'écriture des données de la base de données dans des opérations distinctes. Mais si vous le faites, votre cache des données non valides. Ce qui est encore une chose à prendre en compte.
Mono-Thread Sessions
Sessions Hibernate sont mono-thread. Tout objet chargé par le biais d'une session ne peut être consulté (y compris la lecture) à partir du même thread. Ceci est acceptable pour des applications côté serveur, mais risque de compliquer les choses inutilement si vous faites de l'application graphique.
Je suppose que mon point est que il n'y a pas de repas gratuits.
Hibernate est un bon outil, mais c'est un outil complexe, et il faut du temps pour le comprendre correctement. Si vous ou les membres de votre équipe n'ont pas cette connaissance, il peut être plus simple et plus rapide à aller avec JDBC pur (ou Spring JDBC) pour une application unique. D'autre part, si vous êtes prêt à investir du temps dans l'apprentissage (y compris l'apprentissage par la pratique et le débogage) que dans le futur, vous serez en mesure de comprendre les avantages et les inconvénients de mieux.
Hibernate peut être bonne, mais elle et les autres JPA Orm ont tendance à dicter votre structure de base de données à un degré. Par exemple, les clés primaires composites peut être fait dans Hibernate/JPA, mais ils sont un peu maladroits. Il y a d'autres exemples.
Si vous êtes à l'aise avec SQL je vous suggère fortement de prendre un coup d'oeil à Ibatis. Il peut faire 90%+ de ce Hibernate peut, mais est beaucoup plus simple de mise en œuvre.
Je ne peux pas penser une seule raison pour laquelle je n'avais jamais choisir directement JDBC (ou même Spring JDBC) sur Ibatis. Hibernate est un complexe de choix.
Prendre un coup d'oeil à la Le printemps et l'Ibatis Tutoriel.
Aucun doute Hibernate a sa complexité.
Mais ce que j'aime vraiment à propos de la veille prolongée approche (quelques autres aussi) est le modèle conceptuel que vous pouvez obtenir en Java, c'est mieux. Bien que je ne pense pas OO comme une panacée, et je ne cherche pas théoriques de la pureté de la conception, j'ai trouvé tellement de fois que OO en fait de simplifier mon code. Comme vous l'avez demandé spécifiquement pour les détails, voici quelques exemples :
la qui ajoute à la complexité n'est pas dans le modèle et des entités, mais dans votre cadre pour la manipulation de toutes les entités, par exemple. Pour les responsables, le plus dur n'est pas quelques classes du framework, mais votre modèle, Hibernate vous permet de garder la partie la plus difficile (le modèle) à son plus propre.
si un champ (comme une carte d'identité, ou les champs d'audit, etc) est utilisée dans toutes vos entités, alors vous pouvez créer un superclasse avec elle. Donc :
Hibernate a également de nombreuses fonctionnalités pour faire face à d'autres modèles caractéristiques dont vous pourriez avoir besoin (maintenant ou plus tard, ajouter qu'en cas de besoin). Le prendre comme une extensibilité de qualité pour votre conception.
Avec la réutilisation entre vos entités (mais seulement approprié l'héritage, et composition), il ya habituellement quelques-uns des avantages supplémentaires à venir. Exemples :
Au fil du temps, les exigences évoluent. Il y aura un point où la structure de base de données a des problèmes. Avec JDBC seul, toute modification de la base de données doit avoir un impact sur le code (ie. double coût). Avec mise en veille prolongée, de nombreuses modifications peuvent être absorbés en changeant seulement la cartographie, pas le code. La même chose arrive dans l'autre sens : mise en veille prolongée vous permet de changer votre code (entre les versions, par exemple), sans modifier votre base de données (modification de la cartographie, bien qu'il n'est pas toujours suffisant). Pour résumer, Hibernate permet de faire évoluer votre base de données et votre code independtly.
Pour toutes ces raisons, j'ai choisi de mise en veille prolongée 🙂
Je pense que l'un des deux est un excellent choix, mais personnellement, je voudrais utiliser hibernate. Je ne pense pas que hibernate est overkill pour un projet de cette taille.
Où Hibernate brille vraiment pour moi, c'est les relations entre des entités ou à des tables. Faire JDBC à la main peut prendre beaucoup de code si vous traitez avec la modification des parents et des enfants (petits-enfants, frères, sœurs, etc) en même temps. Hibernate peut faire ce un jeu d'enfant (souvent un seul d'économiser de l'entité mère est assez).
Il y a certainement des complexités lorsque vous traitez avec mise en veille prolongée, de telles que la compréhension de la façon dont la Session de rinçage fonctionne, et de traiter avec le chargement paresseux.
Droite JDBC adaptés aux cas les plus simples, au mieux.
Si vous voulez rester à l'intérieur de Java et des INONDATIONS, puis continue en veille prolongée ou Hibernate/JPA, ou tout-autre-JPA-fournisseur/JPA devrait être votre choix.
Si vous êtes plus à l'aise avec SQL puis d'avoir le Printemps pour JDBC modèles et d'autres SQL orientée cadres ne fera pas de mal.
En revanche, outre le contrôle de transaction, il n'y a pas beaucoup d'aide d'avoir du Printemps lorsque l'on travaille avec JPA.
Hibernate convient le mieux pour le middleware applications. Supposons que nous construisons un moyen vaisselle sur le haut de la base de données, Le middelware est accessible en environ 20 applications dans ce cas, on peut avoir une hibernate qui satisfait à l'exigence de tous les 20 applications.
Dans JDBC, si l'on ouvre une connexion de base de données, il nous faut écrire à essayer, et si l'une des exceptions s'est produite bloc catch seront preneurs à ce sujet, et enfin utilisé pour fermer les connexions.
Dans jdbc toutes les exceptions sont vérifiées exceptions, nous nous devons donc d'écrire du code dans le try, catch et les lancers, mais dans hibernate nous n'avons que non cochée exceptions
Ici en tant que programmeur, nous devons fermer la connexion, ou nous pouvons obtenir une chance d'obtenir notre de connexions message...!
En fait, si nous n'avons pas de fermer la connexion dans le bloc finally, puis jdbc n'est pas responsable pour fermer la connexion.
Dans JDBC nous avons besoin d'écrire les commandes Sql dans divers lieux, après que le programme a créé des si la structure de la table est modifiée alors le programme JDBC ne fonctionne pas, nous avons encore besoin de le modifier et de le compiler et de re-déployer nécessaire, ce qui est fastidieux.
JDBC utilisé pour générer la base de données relative codes d'erreur si une exception se produit, mais les programmeurs java sont inconnues sur ce codes d'erreur de droit.
Alors que nous sommes l'insertion d'un enregistrement, si nous n'avez pas de table dans la base de données JDBC va se lève une erreur du genre “Afficher n'existe pas”, et lance une exception, mais en cas de mise en veille prolongée, si elle ne trouve pas de table dans la base de données, cela va créer la table pour nous
JDBC support de chargement PARESSEUX et Hibernate supporte Désireux de chargement
Hibernate supporte l'Héritage, les Associations, les Collections
En veille prolongée si nous sauver de l'objet de classe dérivée, puis sa classe de base de l'objet seront également stockées dans la base de données, cela signifie hibernate soutenir l'héritage
Hibernate supporte la relation Un-À-Plusieurs,un-À-Un, plusieurs-À - Plusieurs-à-Plusieurs, Plusieurs-À-Un
Hibernate supporte mécanisme de mise en cache par ce fait, le nombre d'allers-retours entre une application et la base de données sera réduite, à l'aide de cette technique de mise en cache de performance d'une application sera majoré de plein
L'obtention de la pagination dans hibernate est assez simple.
Hibernate a la capacité de générer des clés primaires automatiquement alors que nous sommes stocker les enregistrements dans la base de données
Vous pourriez regarder Ebean ORM qui permet de ne pas utiliser les objets de session ... et où le chargement paresseux fonctionne, tout simplement. Certainement une option, pas excessif, et sera plus simple à comprendre.
si des milliards de l'utilisateur à l'aide d'application web ou alors dans la requête jdbc sera exécuté que des milliards de fois mais dans hibernate query sera exécuté qu'une seule fois pour un nombre d'utilisateurs plus important et facile avantage de veille prolongée sur jdbc.