En tant que personne ayant passé pas mal de temps à travailler avec JPA (Java Persistence API, essentiellement l'API ORM standardisée pour Java/J2EE/EJB), qui comprend Hibernate, EclipseLink, Toplink, OpenJPA et d'autres, je vais partager certaines de mes observations.
- Les ORM ne sont pas rapides. Ils peuvent être adéquats et, la plupart du temps, adéquats c'est bien, mais dans un environnement à haut volume et faible latence, ils sont à proscrire ;
- Dans les langages de programmation à usage général comme Java et C#, il faut beaucoup de magie pour qu'ils fonctionnent (par exemple, le tissage en temps de charge en Java, l'instrumentation, etc ;)
- Lorsque vous utilisez un ORM, plutôt que de vous éloigner de SQL (ce qui semble être le but recherché), vous serez surpris du temps que vous passez à modifier le XML et/ou les annotations/attributs pour que votre ORM génère un SQL performant ;
- Pour les requêtes complexes, il n'y a vraiment aucun substitut. Par exemple, dans JPA, il y a des requêtes qui ne sont tout simplement pas possibles en SQL brut et lorsque vous devez utiliser du SQL brut dans JPA, ce n'est pas joli (C#/.Net a au moins des types dynamiques -var - qui sont beaucoup plus agréables qu'un tableau d'objets) ;
- L'utilisation des ORM donne lieu à un grand nombre d'écueils. Il s'agit notamment de comportements involontaires ou inattendus, du fait que vous devez intégrer la capacité d'effectuer des mises à jour SQL de votre base de données (en utilisant refresh() dans JPA ou des méthodes similaires, car JPA met tout en cache par défaut afin de ne pas attraper une mise à jour directe de la base de données ;)
- L'inadéquation objet-relationnel va toujours poser des problèmes. Pour tout problème de ce type, il faut trouver un compromis entre la complexité et la complétude de l'abstraction. Parfois, j'ai eu l'impression que JPA allait trop loin et se heurtait à une véritable loi des rendements décroissants, où la complexité n'était pas justifiée par l'abstraction.
Il y a un autre problème qui nécessite un peu plus d'explications.
Le modèle traditionnel d'une application Web consiste à disposer d'une couche de persistance et d'une couche de présentation (avec éventuellement des services ou d'autres couches intermédiaires, mais ce sont les deux principales pour cette discussion). Les ORM forcent une vue rigide de votre couche de persistance jusqu'à la couche de présentation (c'est-à-dire vos entités).
L'une des critiques des méthodes SQL plus brutes est que l'on se retrouve avec tous ces VO (objets de valeur) ou DTO (objets de transfert de données) qui sont utilisés par une seule requête. Cette situation est présentée comme un avantage des ORM, car elle permet de s'en débarrasser.
Le problème est que ces problèmes ne disparaissent pas avec les ORM, ils se déplacent simplement vers la couche de présentation. Au lieu de créer des VOs/DTOs pour les requêtes, vous créez des objets de présentation personnalisés, généralement un pour chaque vue. En quoi est-ce mieux ? IMHO, ça ne l'est pas.
J'ai écrit à ce sujet dans ORM ou SQL : Sommes-nous déjà arrivés ? .
Ma technologie de persistance de prédilection (en Java) est aujourd'hui ibatis. C'est une enveloppe assez fine autour de SQL qui fait plus de 90% de ce que JPA peut faire (il peut même faire du chargement paresseux de relations bien que ce ne soit pas bien documenté) mais avec beaucoup moins de frais généraux (en termes de complexité et de code réel).
Cela s'est produit l'année dernière dans une application GWT que j'écrivais. Beaucoup de traduction d'EclipseLink vers des objets de présentation dans l'implémentation du service. Si nous utilisions ibatis, il aurait été beaucoup plus simple de créer les objets appropriés avec ibatis, puis de les passer de haut en bas de la pile. Certains puristes pourraient dire que c'est Bad™. Peut-être bien (en théorie) mais je vais vous dire : cela aurait conduit à un code plus simple, une pile plus simple et plus de productivité.
1 votes
Normalisation, sécurité, maintenabilité, abstraction du langage, DRY, etc.
0 votes
Les performances avec ORM peuvent être proches de SQL, tout dépend si vous l'utilisez correctement et avec les bons paramètres... Voir comment rendre EF6.x 5 fois plus rapide : linkedin.com/pulse/
0 votes
Pour l'architecture ORM et le mode d'emploi (ce qu'il faut éviter), voici mon autre lien : linkedin.com/pulse/
0 votes
La cartographie objet-rationnelle (ORM) est déjà très populaire dans de nombreux langages de programmation et constitue l'une des meilleures alternatives à SQL. Je me suis inspiré du style de chaînage de méthodes pour créer CQL pour mon projet TRIADB. healis.eu/triadb/#latest-release
7 votes
C'est idiot que cette question ait été fermée.
2 votes
ORM est une excuse pour ne pas connaître SQL ou être paresseux pour l'écrire. Si vous ne connaissez pas SQL, utilisez ORM. Mais ne perdez pas votre temps à penser que vous ferez moins de travail en utilisant ORM, ce serait une fausse croyance. La portabilité est d'accord... choisissez ORM si votre projet nécessite une portabilité entre les bases de données. Vitesse ? allez-y avec SQL car ORM n'est pas rapide. Fiabilité : je m'en tiendrais à SQL. Sécurité, au moins rien de bien inquiétant dans les deux cas. En résumé, tout dépend des exigences de votre projet, notamment en ce qui concerne la portabilité des bases de données.