web-dev-qa-db-fra.com

Hibernate Vs iBATIS

Pour la refonte de notre nouveau produit, nous sommes en train de sélectionner le meilleur framework Java. Comme la considération est d'opter pour 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. Veuillez conseiller ce qui est le meilleur car les deux offrent la persistance.

72
user241394

Ibatis et Hibernate sont des bêtes très différentes.

La façon dont j'ai tendance à le voir est la suivante: Hibernate fonctionne mieux si votre vue est plus centrée sur l'objet. Si toutefois vous voyez est plus centré sur la base de données alors Ibatis est un choix beaucoup plus fort.

Si vous contrôlez complètement votre schéma et que vous n'avez pas d'exigence de débit extrêmement élevée, Hibernate peut très bien fonctionner. Le modèle objet rend le code assez pratique mais à un coût de complexité énorme.

Si vous avez affaire à un schéma de base de données "hérité" dans lequel vous devez écrire des requêtes SQL assez compliquées, il est probable qu'Ibatis fonctionnera mieux.

HQL (Hibernate Query Language) est une autre langue que vous devrez apprendre et même alors, vous trouverez probablement des cas où vous encore devez écrire SQL. De plus, il est probable que vous passiez une demi-journée à trouver la bonne combinaison de XML, de propriétés, d'annotations, etc. pour que Hibernate génère une requête SQL performante.

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

180
cletus

Considérez ce que vous essayez de réaliser. En règle générale, le modèle Ségrégation des réponses aux requêtes de commande fonctionne bien pour les domaines complexes.

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

  1. Créer/mettre à jour/supprimer des entités de domaine complexes
  2. Exécuter des requêtes de récupération analytique (c'est-à-dire des requêtes de sommation/agrégation)

Hibernate fonctionne bien pour le cas 1, vous permettant de créer un POJO et de le conserver/mettre à jour. Il le fait également rapidement, sauf si votre domaine est assez volumineux.

myBatis est idéal pour récupérer des requêtes (cas 2) où vous voulez juste une réponse. Hibernate tenterait de charger l'intégralité du graphique d'objet et vous auriez besoin de commencer à régler les requêtes avec des astuces LazyLoading pour le faire fonctionner 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 sont la différence entre les commandes où vous souhaitez modifier les données du domaine et les réponses où vous voulez 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 récupérez simplement des informations, utilisez myBatis. Si vous avez un domaine complexe et des entités persistantes, 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 le garder sous contrôle. ;)

45
Joseph Lust

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 orienté objet tandis qu'iBATIS fonctionne bien lorsque vous devez vous intégrer à une base de données existante et est plus centré sur les données.

Je pense aussi qu'Hibernate a un peu plus de courbe d'apprentissage. Avec iBATIS, il est assez facile de savoir ce qui se passe alors que plus de "magie" se produit avec Hibernate. En d'autres termes, les débutants pourraient trouver les iBatis plus faciles à utiliser et à comprendre.

Mais je ne dis pas que vous devriez préférer iBatis, iBatis et Hibernate sont juste différents comme dit ci-dessus.

Et en passant, si vous optez pour Hibernate, envisagez peut-être d'utiliser les annotations de mappage objet/relationnel JPA et EJB 3.0 (JSR-220) standard fournies par Hibernate Annotations .

18
Pascal Thivent

ORM vs framework de persistance

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

Schéma de base de données

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

Cache

Hibernate possède un cache de premier niveau qui est impossible à désactiver. Cela signifie que si vous interrogez un élément via ORM, puis le supprimez directement avec SQL, il reste dans le cache. Vous pouvez explicitement vider le cache pour obtenir les résultats les plus à jour de la base de données. Discussions connexes:

Gestion optimisée des verrous

Il existe également des différences pour une gestion optimiste des verrous:

MyBatis ne prend pas en charge le contrôle de concurrence optimiste de manière native, contrairement aux outils ORM comme Hibernate/JPA avec l'annotation @Version.

Discussions connexes:

Chargement différé

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

Gestion de session de mise en veille prolongée

Les opérations d'entités telles que l'enregistrement, la mise à jour ou la suppression sont effectuées via Hibernate Session . Cela nécessite une bonne compréhension de la façon de mettre en œuvre une stratégie de gestion de session Hibernate appropriée pour éviter detached entity passed to persist et d'autres phénomènes liés à Hibernate.

Parfois, il peut prendre plus de temps pour 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.

En cascade

Hibernate fournit la cascade, la suppression des orphelins et d'autres fonctionnalités pour les graphiques d'objets lorsqu'ils ne sont pas présents dans myBatis - pour les implémenter, vous devrez écrire explicitement les requêtes SQL.

Requêtes

Dans myBatis, vous écrirez des requêtes SQL presque simples. Hibernate a plusieurs options pour former une requête: SQL, HQL, API Criteria. Parfois, il peut être approprié d'utiliser l'API Criteria lorsque vous avez de nombreux champs facultatifs dans les critères. Il fournirait une approche plus structurée de la requête de formulaire et éviterait peut-être les erreurs associées.

15
Justas

Hibernate est un ORM, ce qui signifie (à son niveau le plus élémentaire) qu'il mappe les instances d'objets Java sur les lignes réelles d'une table de base de données. Généralement, pour les pojo récupérés via Hibernate: toutes les manipulations et modifications apportées à ceux-ci pojo apparaîtra dans la base de données. Hibernate générera et exécutera le SQL approprié à un moment approprié.

Mybatis (à son niveau le plus élémentaire) est simplement un outil pour reconstituer et exécuter SQL stocké dans des fichiers xml. Il ne mappe pas les instances de Java aux lignes d'une table de base de données, il mappe plutôt Java aux instructions SQL, et ce n'est donc pas un ORM). Il peut aussi renvoyer des pojo bien sûr, mais ils ne sont liés à aucun type de contexte de persistance.

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

Les critères pour vous permettre de choisir lequel utiliser, je crois, dépendent essentiellement du modèle de base de données avec lequel vous devez travailler.

Par exemple, imaginez un grand schéma tentaculaire, représentant un modèle d'assurance. Les développeurs sont tenus de récupérer des données et d'interagir avec ces données d'une manière qui répond à l'entreprise en question.

Le développeur arrive et ne devrait jamais avoir les connaissances commerciales requises pour écrire tous le sql à la main (ce dont Mybatis aurait besoin). Hibernate conviendrait à un scénario comme celui-ci.

Les analystes métier définissent le modèle de données, les entités, les relations et les interactions, tout comme leur expertise. Java utilise ensuite Hibernate pour "suivre le modèle". Le développeur peut devenir très productif rapidement sans avoir besoin d'écrire sql sujet à des erreurs compliquées pour s'exécuter sur un schéma très compliqué.

Dans mon expérience, Hibernate et Mybatis sont utilisés régulièrement sur le même projet.

Où Hibernate est utilisé pour

  • Fonctionnalité générale du C.R.U.D
  • "Promouvoir" le modèle relationnel "objet de domaine"
  • Gestion de session

et où Mybatis est utilisé pour

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

si vous utilisez déjà Spring, je commencerais par Spring JDBC plutôt que de plonger directement dans Hibernate ou iBatis. Si vous écrivez votre niveau de persistance en termes d'interfaces, vous ne devriez avoir aucun problème à changer d'implémentation après avoir mis Hibernate ou iBatis à votre disposition.

Il n'y a aucune raison pour que ce soit une décision "tout ou rien". Utilisez ce qui convient le mieux à votre situation.

6
duffymo