| « hibernate4gwt | Technical tip : Using Acegi with GWT » |
Hibernate ou JPA : l’embarras du choix ?
Pour un nouveau développement, vous préconiseriez plutôt d’utiliser Hibernate ou JPA ?
De prime abord, la question peut sembler étrange tant Hibernate semble avoir inspiré le standard Java Persistence API. Les technologies sont même tellement proches qu’un tel choix s’avère presque paradoxal : après tout, Hibernate est une implémentation de JPA, cela revient donc à comparer un Coca et un Coca light ;)
De prime abord, JPA semble le choix évident. C’est en effet une API standard, et donc interchangeable. Tout développement JPA fonctionne donc sans peine tant sur Hibernate que TopLink, OpenJPA, …
C’est tout ? Eh bien, oui, c’est tout ce que JPA apporte au monde Java.
Voyons maintenant ce qu’il enlève à un développement Hibernate.
En effet, JPA étant le plus petit dénominateur commun entre différentes librairies de persistance (Hibernate, TopLink, …), certaines fonctionnalités Hibernate ne font pas partie du standard et ne sont pas supportées par les autres implémentations (ou alors de manière tout aussi propriétaire).
On peut citer pêle-mêle (liste non exhaustive) :
- Les API Criteria et Example
- La gestion du flush manuel
- Mécanismes d’attachement et détachements d’objets
- Support des curseurs
- Filtrage dynamique des résultats
- Gestion du cache de second niveau
- Cascade « delete-orphan »
Certains seront tentés de coder les fonctionnalités « standard » avec l’API JPA, et de revenir à l’API Hibernate lorsque le besoin s’en fait sentir. Comportement assez étrange et hypocrite en fait, puis que le code s’en trouve tout de même lié à Hibernate ! Quitte à choisir une API, autant être cohérent sur toute l’application…
Autre point à prendre en compte : l’évolution. Le processus de strandardisation est généralement un travail de longue haleine, qui se chiffre généralement en mois et en années. Du coup, l’intégration des fonctionnalités Hibernate absente de JPA (ou de nouvelles) ne se fera sans doute pas avant la prochaine version, la JSR 313 (J2EE 6), prévue… fin 2008 !
En passant, il est intéressant que noter que la capacité d’innovation de Sun frise le zéro absolu : les dernières « révolutions » Java (JUnit, Struts, Hibernate, GWT,…) proviennent toutes du monde du logiciel Open-Source :>!
Et en attendant la JSR 313, que va faire Hibernate d’après vous ? Innover bien sûr !
A ce titre, la lecture de la FAQ Hibernate est assez éclairante :
Now that EJB 3.0 is out, is Hibernate dead?
Certainly not! We got involved in EJB 3.0 because we wanted to bring ORM technology to the masses. The EntityManager API defined by JSR-220 is just an alternative way to call Hibernate, from our point of view. We hope and expect that the standardization of ORM as a central, integrated piece of the J2EE platform will drive the next wave of adoption of ORM and Hibernate.
Because the standards process is an inappropriate place to innovate new functionality, and because it takes several years to validate a new idea and then work it into a final specification document, we will continue to develop and innovate our own APIs and use them to provide cutting edge features to those users for whom portability is not a major priority. For example, we are providing the cool new filtering functionality via the traditional Hibernate Session interface. In time, new features that prove sufficiently important will probably find their way into the EJB spec.
Clairement, Hibernate va continuer à évoluer (on pense notamment à Hibernate Shards ou Validator qui viennent d’être publiés récemment), et ces modifications ne seront intégrées à JPA que plusieurs mois ou plusieurs années plus tard.
Au vu de tels arguments, la question « Hibernate ou JPA » est sans doute plus difficile à trancher que de prime abord. L’interrogation centrale réside sans doute dans la cible du logiciel à développer : nécessite-t’il vraiment de fonctionner sur plusieurs implémentations de serveur d’application ? Vos développeurs peuvent-ils se passer des fonctionnalités propriétaires Hibernate telles que les Criteria, le réattachement, ou le filtrage dynamique ?
Des réponses à ces questions dépendront sans doute la préconisation adéquate…
4 commentaires
- Le mapping hibernate est nettement + riche que celui de jpa (pour les Map, les component, les formula, etc...). Donc pour le mapping, j'utiliserais plutôt les fichiers hbm.xml (ou les annotation hibernate selon les gouts). En sachant que le mapping ne couple pas trop l'appli à hibernate.
- Pour la partie API, c'est + embêtant car le couplage à hibernate est + fort, mais dès que l'on a un besoin un peu complexe (genre les filtres comme tu disais), on est bien obligé de passer à du full hibernate.
Mais comme maintenant tout le monde à pris l'habitude de bien isoler la partie accès aux données (couche DAO) de son application, ce n'est pas si dérangeant d'avoir un couplage à l'api hibernate (tellement riche).
Quand au couplage au serveur d'appli, hibernate tourne sur tous.
Donc je rejoins ta conclusion : à moins d'avoir un besoin d'ORM très basique, on ne peut pas, juste pour des raisons de standardisation, s'embêter la vie en se passant de la grande richesse du mapping et de l'API Hibernate.
Tellement qu'elle est riche Hibernate devient complexe, non ? C'est vrai que JPA s'inspire largement d'Hibernate mais faut pas oublier qu'ils ont simplifié pas mal les choses.
Le support de JPA dans les environnement JEE est un autre point fort à noter. Le dev devient très rapide si on travaille avec les valeurs par défaut.
Et puis faut pas oublier la combinaison EJB/JPA. Malgré la complexité des versions précédentes, plusieurs grandes sociétés (dans le domaine de la banque notamment) ont adopté les EJB. Maintenant que les choses deviennent plus simple avec les EJB3, je crois que cela ne peut que pencher en faveur du JPA.
Amicalement.
Je ne suis pas sûr que l'objectif de JPA est de simplifier Hibernate. Les quelques points mentionnés dans ce billet sont des manques, et non des simplifications, et c'est ce qui me pose problème...
Concernant les environnements EJB, en effet, l'avénement de JPA permet une simplification et une standardisation bienvenue dont il serait dommage de se passer.
Cordialement
Bruno