Je peux recommander Hibernate. Il est largement utilisé (et à juste titre), et le fait que la spécification de l'API de persistance Java a été dirigée par le principal concepteur de Hibernate garantit qu'il sera là pour un avenir prévisible :-) Si la portabilité et la neutralité vis-à-vis des fournisseurs sont importantes pour vous, vous pouvez l'utiliser via JPA, afin de pouvoir facilement passer à une autre implémentation JPA à l'avenir.
N'ayant pas d'expérience personnelle avec JDO, je ne peux pas vraiment les comparer. Cependant, les avantages de Hibernate (ou de l'ORM en général) semblent à première vue être sensiblement les mêmes que ceux répertoriés sur la page JDO. Pour moi, les points les plus importants sont :
- Neutralité à la base de données : Hibernate prend en charge plusieurs dialectes SQL en arrière-plan, passer d'une BD à l'autre est aussi simple que de changer une seule ligne dans votre configuration
- performances : chargement paresseux par défaut, et bien plus d'optimisations se produisent en arrière-plan, que vous devriez gérer manuellement avec JDBC
- vous pouvez vous concentrer sur votre modèle de domaine et la conception OO plutôt que sur les problèmes de base de données de bas niveau (mais vous pouvez bien sûr peaufiner DML et DDL si vous le souhaitez)
Un inconvénient potentiel (des outils ORM en général) est qu'ils ne sont pas très adaptés au traitement par lots. Si vous devez mettre à jour 1 million de lignes dans votre table, l'ORM ne fonctionnera jamais aussi bien qu'une mise à jour par lots JDBC ou une procédure stockée par défaut. Hibernate peut cependant intégrer des procédures stockées, et il prend en charge le traitement par lots dans une certaine mesure (je ne suis pas encore familier avec cela, donc je ne peux pas vraiment dire s'il est à la hauteur de la tâche à cet égard par rapport à JDBC - mais d'après ce que je sais jusqu'à présent, probablement oui). Ainsi, si votre application nécessite un certain traitement par lots mais traite principalement d'entités individuelles, Hibernate peut quand même fonctionner. Si elle effectue principalement un traitement par lots, peut-être JDBC est un meilleur choix.