J'ai un projet sur lequel je travaille actuellement en utilisant Tomcat, Spring 4, Spring Security, MySQL et JPA avec Hibernate.
J'ai choisi JPA du point de vue qu'il est censé rendre la mise en œuvre sous-jacente des fournisseurs ORM transparente, ou du moins moins douloureuse. Je dirais que cela utilise mentalement la spécification sur la mise en œuvre (JAX-RS) est le point de vue par défaut de la communauté de développement Java.
Je suis curieux de savoir si c'est vraiment une tâche qui mérite d'être accomplie. Je suis sûr que si j'utilisais Hibernate directement, je gagnerais en puissance car je pourrais utiliser des fonctionnalités qui ne font pas partie de la spécification JPA principale.
Une partie de ma préoccupation vient de l'idée de YAGNI. Je programme essentiellement dans un style et une mode spécifiques (en utilisant JPA au lieu de Hibernate) afin qu'à un moment donné dans le futur, je puisse échanger mon implémentation ORM. Je doute fortement que cela se produise au cours de la vie du produit, donc je fais essentiellement des efforts pour quelque chose dont je ne récolterai probablement jamais les bénéfices.
Quelles sont vos pensées? La «programmation vers l'interface» en vaut-elle la peine lorsqu'il s'agit de choses comme JPA? Avez-vous déjà échangé une implémentation ORM entière dans un produit? Avez-vous déjà pu éviter complètement l'abstraction de quelque chose comme JPA qui fuit de toute façon? Personnellement, j'ai déjà un seul appel SQL natif (pour nettoyer les tables de la base de données), et il y a des choses que j'aimerais faire avec qui sont intégrées dans la spécification JPA (obtenir / définir des préfixes pour vos méthodes et la différence entre MEMBER OF / IN, qui ne me liant qu'à une implémentation sous-jacente me donnera une chance d'éviter.