86 votes

Hibernate et iBATIS

Pour la réingénierie de notre nouveau produit, nous sommes en train de sélectionner le meilleur cadre de Java. Comme il s'agit d'adopter une approche agnostique de la base de données pour le modèle, nous travaillons sur des options entre Struts + Spring avec iBATIS ou Hibernate. Merci de nous conseiller le meilleur car les deux offrent la persistance.

197voto

cletus Points 276888

IBATIS et Hibernate sont deux choses très différentes.

J'ai tendance à considérer les choses de la manière suivante : Hibernate fonctionne mieux si votre vue est plus centré sur l'objet . Si toutefois votre point de vue est plus centré sur la base de données alors iBATIS est un choix beaucoup plus judicieux.

Si vous maîtrisez parfaitement votre schéma et que vous n'avez pas besoin d'un débit extrêmement élevé, Hibernate peut très bien fonctionner. Le modèle objet permet d'obtenir un code assez pratique, mais à un coût moindre. énorme le coût de la complexité.

Si vous avez affaire à un schéma de base de données "ancien" pour lequel vous devez écrire des requêtes SQL assez compliquées, il y a de fortes chances qu'iBATIS fonctionne mieux.

HQL (Hibernate Query Language) est un autre langage que vous devrez apprendre et, même dans ce cas, vous trouverez probablement des cas où vous devrez encore besoin d'écrire du SQL. De plus, il y a de fortes chances que vous passiez une demi-journée à trouver la bonne combinaison de XML, de propriétés, d'annotations, etc. pour qu'Hibernate génère une requête SQL performante.

Il n'y a pas de réponse universelle "A est mieux que B" à cette question.

53voto

Joseph Lust Points 4961

Réfléchissez à l'objectif que vous souhaitez atteindre. En règle générale, le Ségrégation des réponses aux commandes et aux requêtes fonctionne bien pour les domaines complexes.

La raison en est que vous essayez de faire l'une des deux choses suivantes :

  1. Créer/mettre à jour/supprimer certaines entités complexes du domaine
  2. Exécuter des requêtes analytiques (c'est-à-dire des requêtes de sommation ou d'agrégation)

Hibernation fonctionne bien pour le cas 1, vous permettant de créer un POJO et de le persister/mettre à jour. Cela se fait également rapidement, à moins que votre domaine ne soit très étendu.

monBatis est idéal pour les requêtes de type "fetch" (cas 2) où l'on souhaite simplement obtenir une réponse. Hibernate essaierait de charger tout le graphe d'objets et vous devriez commencer à régler les requêtes avec des astuces de LazyLoading pour que cela fonctionne sur un grand domaine. Inversement, si vous voulez juste une page POJO analytique, l'implémentation myBatis de la même requête serait triviale.

Pour cette raison, myBatis est plus rapide que Hibernate à SELECTS.

Ces deux cas constituent la différence entre Commandes où vous souhaitez modifier les données du domaine et Réponses lorsque vous souhaitez simplement récupérer des données.

Considérez donc ces deux cas et ce que fait votre application. Si vous avez un domaine simple et que vous vous contentez de récupérer des informations, utilisez myBatis. Si vous avez un domaine complexe et que vous devez persister des entités, utilisez Hibernate. Si vous faites les deux, envisagez une approche hybride. C'est ce que nous utilisons sur notre projet qui a des milliers d'entités pour garder le contrôle ;)

26voto

Justas Points 2539

ORM et cadre de persistance

Hibernate est un cadre de mappage objet-relation (ORM) qui fait correspondre des classes Java à des tables de base de données. MyBatis est un cadre de persistance - pas un ORM. Il fait correspondre des instructions SQL à des méthodes Java.

Schéma de la base de données

Hibernate peut créer ou valider le schéma de la base de données en fonction de votre modèle Java alors que MyBatis n'a pas cette fonctionnalité. MyBatis est également pratique pour l'environnement de test lorsque vous utilisez une base de données en mémoire. Discussions connexes :

Cache

Hibernate dispose d'un cache de premier niveau qu'il est impossible de désactiver. Cela signifie que si vous interrogez un élément par le biais de l'ORM et que vous le supprimez ensuite directement avec SQL, il reste dans le cache. Vous pouvez explicitement effacer le cache pour obtenir les résultats les plus récents de la base de données. Discussions connexes :

Gestion optimiste des serrures

Il existe également des différences en ce qui concerne la gestion optimiste des verrous :

MyBatis ne supporte pas la concu contrairement aux outils ORM comme Hibernate/JPA avec l'annotation @Version.

Discussions connexes :

Chargement paresseux

Hibernate essaiera de charger l'ensemble du graphe d'objets, à l'exception des objets marqués pour le chargement paresseux. myBatis chargera les données en fonction d'une requête SQL. Le chargement paresseux peut améliorer les performances, mais il peut entraîner des fuites de connexion s'il est utilisé avec des objets de type <property name="hibernate.enable_lazy_load_no_trans" value="true" /> propriétés. Discussions connexes :

Gestion des sessions Hibernate

Les opérations sur les entités, telles que l'enregistrement, la mise à jour ou la suppression, sont effectuées par Hibernate. Session . Il faut bien comprendre comment mettre en œuvre une stratégie de gestion des sessions Hibernate appropriée pour éviter les problèmes suivants detached entity passed to persist et d'autres phénomènes liés à Hibernate.

Parfois, il peut être plus long d'essayer de comprendre le comportement sous-jacent d'Hibernate que d'ajouter un peu plus de travail et d'écrire des instructions SQL brutes pour myBatis.

Cascade

Hibernate fournit des fonctions de cascade, de suppression des orphelins et d'autres fonctions pour les graphes d'objets, alors qu'elles ne sont pas présentes dans myBatis - pour les mettre en œuvre, vous devrez écrire des requêtes SQL de manière explicite.

Requêtes

Dans myBatis, vous écrirez des requêtes SQL presque simples. Hibernate dispose de plusieurs options pour former des requêtes : SQL, HQL, Criteria API. Parfois, il peut être utile d'utiliser l'API Critères lorsque vous avez de nombreux champs optionnels dans les critères. Cela permet d'avoir une approche plus structurée de la requête de formulaire et d'éviter les erreurs qui en découlent.

19voto

Pascal Thivent Points 295221

Cletus a fait un excellent travail pour résumer cette comparaison. Hibernate fonctionne bien lorsque vous contrôlez le modèle de données et est plus centré sur l'objet, tandis qu'iBATIS fonctionne bien lorsque vous avez besoin d'intégrer une base de données existante et est plus centré sur les données.

Je pense également qu'Hibernate est un peu plus difficile à apprendre. Avec iBATIS, il est assez facile de savoir ce qui se passe, tandis que la "magie" se produit davantage avec Hibernate. En d'autres termes, les débutants pourraient trouver iBatis plus facile à utiliser et à comprendre.

Mais je ne dis pas qu'il faut préférer iBatis, iBatis et Hibernate sont juste différents comme dit plus haut.

D'ailleurs, si vous optez pour Hibernate, envisagez peut-être d'utiliser les annotations standardisées de mappage objet/relationnel JPA et EJB 3.0 (JSR-220) fournies par Annotations Hibernate .

8voto

user1354278 Points 1109

Hibernate est un ORM, ce qui signifie (à son niveau le plus basique) qu'il fait correspondre des instances d'objets Java à des lignes réelles dans une table de base de données. En général, pour les pojos récupérés par Hibernate, toutes les manipulations et modifications de ces pojos apparaîtront dans la base de données. Hibernate génère et exécute le code SQL approprié au moment opportun.

Mybatis (à son niveau le plus basique) est simplement un outil pour assembler et exécuter le langage SQL qui est stocké dans des fichiers xml. Il ne fait pas correspondre des instances d'objets Java à des lignes dans une table de base de données, mais il fait correspondre des méthodes Java à des instructions SQL, et ce n'est donc pas un ORM. Il peut également renvoyer des pojo, bien sûr, mais ils ne sont pas liés à un quelconque contexte de persistance.

Les deux outils font beaucoup plus que ce qui est décrit ci-dessus, mais l'un est un ORM et l'autre non.

Les critères permettant de choisir l'un d'entre eux dépendent essentiellement du modèle de base de données avec lequel vous devez travailler.

Imaginons, par exemple, un grand schéma tentaculaire représentant un modèle d'assurance. Les développeurs doivent récupérer les données et d'interagir avec ces données d'une manière qui réponde aux besoins de l'entreprise.

Les développeurs vont et viennent, et on ne s'attendrait jamais à ce qu'ils aient les connaissances commerciales nécessaires pour rédiger des documents. todos le sql à la main (ce que Mybatis nécessiterait). Hibernate conviendrait à un tel scénario.

Les analystes commerciaux définissent le modèle de données, les entités, les relations et les interactions, en fonction de leur expertise. Les développeurs Java utilisent ensuite Hibernate pour "parcourir le modèle". Les développeurs commerciaux peuvent devenir très productifs rapidement sans avoir besoin d'écrire du code SQL compliqué et sujet aux erreurs pour l'exécuter sur un schéma très compliqué.

Dans mon expérience, Hibernate et Mybatis sont régulièrement utilisés dans le cadre d'un même projet.

Où Hibernate est utilisé

  • Fonctionnalité générale du C.R.U.D.
  • La "marche" du modèle relationnel "domaine-objet
  • Gestion des sessions

et où Mybatis est utilisé pour

  • requêtes ad hoc
  • lancer des procédures stockées (et interagir avec elles)
  • répondre à des demandes très spécifiques ou complexes
  • prendre en charge les requêtes de recherche complexes, lorsque les critères de recherche sont dynamiques, et la pagination des résultats

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X