Hibernate contre iBATIS

Pour notre nouvelle réingénierie des produits, nous sums en train de sélectionner le meilleur framework à partir de Java. Comme il faut envisager une approche agnostique de la firebase database pour le modèle, nous travaillons sur des options entre Struts + Spring et iBATIS ou Hibernate. S’il vous plaît conseil qui est le meilleur car les deux offrent la persistance.

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

La façon dont j’ai tendance à regarder est la suivante: Hibernate fonctionne mieux si votre vue est plus centrée sur les objects . Si, toutefois, vous considérez qu’il est plus centré sur les bases de données, Ibatis est un choix beaucoup plus important.

Si vous contrôlez complètement 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 object permet d’obtenir un code assez pratique, mais à un coût très élevé.

Si vous avez affaire à un schéma de firebase database “hérité” où vous devez écrire des requêtes SQL assez complexes, il est probable que Ibatis fonctionnera mieux.

HQL (Hibernate Query Language) est un autre langage que vous devez apprendre et même alors, vous trouverez probablement des cas où vous avez 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, propriétés, 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.

Réfléchissez à ce que vous essayez de réaliser. En règle générale, le modèle de séparation des requêtes de requête de commande 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 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. Cela se fait aussi rapidement, à moins que votre domaine ne soit trop volumineux.

myBatis est idéal pour les requêtes d’extraction (cas 2) où vous souhaitez simplement une réponse. Hibernate tenterait de charger l’intégralité du graphe d’object et vous devrez commencer à régler les requêtes avec les astuces de LazyLoading pour continuer à travailler sur un grand domaine. Inversement, si vous voulez simplement une page analytique POJO, l’implémentation myBatis de la même requête serait sortingviale.

De ce fait, myBatis est plus rapide que Hibernate chez SELECTS.

Ces deux cas sont la différence entre les commandes pour lesquelles vous souhaitez modifier les données du domaine et les réponses pour lesquelles vous souhaitez simplement récupérer certaines données.

Alors, considérez ces deux cas et ce que fait votre application. Si vous avez un domaine simple et que vous 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. 😉

Cletus a fait un excellent travail en résumant cette comparaison. Hibernate fonctionne bien lorsque vous contrôlez le modèle de données et qu’il est plus centré sur les objects alors qu’iBATIS fonctionne bien lorsque vous avez besoin d’intégrer une firebase database existante et est plus centré sur les données.

Je pense aussi que Hibernate a un peu plus de temps pour apprendre. Avec iBATIS, il est assez facile de savoir ce qui se passe alors que Hibernate fait plus de «magie». En d’autres termes, les débutants pourraient trouver iBatis plus facile à utiliser et à comprendre.

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

Et en passant, si vous optez pour Hibernate, envisagez peut-être d’utiliser des annotations de mappage object / relationnel standardisées JPA et EJB 3.0 (JSR-220) fournies par Hibernate Annotations .

Cadre ORM vs persistance

Hibernate est un cadre de mappage de relation d’object (ORM) qui associe les classes Java aux tables de firebase database. MyBatis est un framework de persistance – pas d’ORM. Il mappe les instructions SQL aux méthodes Java.

Schéma de firebase database

Hibernate peut créer ou valider un schéma de firebase database en fonction de votre modèle Java, alors que MyBatis n’a pas cette fonctionnalité. Il est également pratique pour tester l’environnement lorsque vous utilisez une firebase database en mémoire. Discussions connexes:

  • MyBatis peut-il créer le schéma de firebase database?

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 via ORM puis le supprimez directement avec SQL, il rest dans le cache. Vous pouvez explicitement effacer le cache pour obtenir les résultats les plus récents de la firebase database. Discussions connexes:

  • Les données de chargement Jpa & Hibernate qui changent de manière asynchrone dans la firebase database?
  • Que sont les mises en cache de premier et deuxième niveau dans Hibernate?

Gestion des verrous optimiste

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

MyBatis ne prend pas en charge le contrôle de concurrence optimiste en mode natif, contrairement aux outils ORM tels que Hibernate / JPA avec l’annotation @Version.

Discussions connexes:

  • Contrôle de concurrence optimiste
  • Comment prévenir le problème de concurrence dans UPDATE via iBatis

Chargement paresseux

Hibernate va essayer de charger tout le graphe d’object, à l’exception des objects marqués pour un chargement différé. myBatis chargera les données en fonction d’une requête SQL. Le chargement différé peut améliorer les performances, mais il peut provoquer des fuites de connexion s’il est utilisé avec les . Discussions connexes:

  • org.hibernate.LazyInitializationException – Impossible d’initialiser le proxy – pas de session
  • Résoudre le problème de Hibernate Lazy-Init avec hibernate.enable_lazy_load_no_trans

Gestion de session Hibernate

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 manière de mettre en œuvre une stratégie de gestion de Hibernate Session appropriée pour éviter que l’ detached entity passed to persist et d’autres phénomènes liés à Hibernate.

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

En cascade

Hibernate fournit la suppression en cascade, la suppression des orphelins et d’autres fonctionnalités pour les graphes d’objects lorsqu’ils ne sont pas présents dans myBatis. Pour les implémenter, vous devrez écrire des requêtes SQL de manière explicite.

Requêtes

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

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 pas avoir de problème pour changer d’implémentation après avoir eu Hibernate ou iBatis sous votre ceinture.

Il n’y a aucune raison pour que ce soit une décision “tout ou rien”. Utilisez ce qu’il y a de mieux pour votre situation.

Hibernate est un ORM, ce qui signifie (à son niveau le plus élémentaire) qu’il mappe les instances d’objects Java sur les lignes réelles d’une table de firebase database. Généralement, pour les pojo récupérés via Hibernate: toutes les manipulations et modifications apscopes à ces pojo apparaîtront dans la firebase database. Hibernate va générer et exécuter le SQL approprié au moment opportun.

Mybatis (à son niveau le plus basique) est simplement un outil permettant de rassembler et d’exécuter du code SQL stocké dans des fichiers XML. Il ne mappe pas les instances d’objects Java sur les lignes d’une table de firebase database. Il mappe plutôt les méthodes Java sur des instructions SQL, et par conséquent ce n’est 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 permettant de choisir celui à utiliser dépendent, je pense, du modèle de firebase database avec lequel vous devez travailler.

Par exemple, imaginez un vaste schéma tentaculaire, représentant un modèle d’assurance. Les développeurs doivent récupérer des données et interagir avec ces données de manière à répondre aux besoins de l’entreprise.

Les développeurs vont de l’avant, et on ne s’attendrait jamais à ce qu’ils aient les connaissances professionnelles nécessaires pour écrire tous les sql à la main (ce que Mybatis exigerait). Hibernate conviendrait à un scénario comme celui-là.

Les analystes métier définissent le modèle de données, les entités, les relations et les interactions, ainsi que leur expertise. Les développeurs Java utilisent ensuite Hibernate pour “parcourir le modèle”. Le développeur d’entreprise peut devenir très productif rapidement sans avoir besoin d’écrire des fichiers SQL compliqués et susceptibles de s’exécuter sur un schéma très complexe.

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 CRUD
  • «Relation» du modèle relationnel «object 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
  • prise en charge de requêtes de recherche complexes, où les critères de recherche sont dynamics et pagination des résultats