C'est une question assez ouverte. Je vais commencer un nouveau projet et je cherche différents ORM à intégrer à l'accès à la base de données.
Avez-vous des favoris? Y a-t-il des personnes que vous conseilleriez d'éviter?
J'ai cessé d'utiliser les ORM.
La raison n'est pas un gros défaut dans le concept. Hibernate fonctionne bien. Au lieu de cela, j'ai constaté que les requêtes nécessitaient peu de temps système, que je pouvais intégrer beaucoup de logique complexe à de grandes requêtes SQL et transférer une grande partie de mon traitement dans la base de données.
Pensez donc simplement à utiliser le package JDBC.
Aucun, car avoir un ORM enlève trop de contrôle avec de petits avantages. Les gains de temps que vous gagnez sont facilement supprimés lorsque vous devez corriger des anomalies résultant de l'utilisation de l'ORM. De plus, les ORM découragent les développeurs d'apprendre le langage SQL, le fonctionnement des bases de données relationnelles et de l'utiliser à leur avantage.
Beaucoup d'ORM sont géniaux, vous devez savoir pourquoi vous voulez ajouter de l'abstraction à JDBC. Je peux vous recommander http://www.jooq.org (avertissement: je suis le créateur de jOOQ, cette réponse est donc biaisée). jOOQ adopte le paradigme suivant:
Il y a beaucoup d'autres bons ORM. Surtout Hibernate ou iBATIS ont une grande communauté. Mais si vous recherchez une solution intuitive et simple, je vous suggère d'essayer jOOQ. Tu l'adoreras! :-)
Découvrez cet exemple SQL:
// Select authors with books that are sold out
SELECT *
FROM T_AUTHOR a
WHERE EXISTS (SELECT 1
FROM T_BOOK
WHERE T_BOOK.STATUS = 'SOLD OUT'
AND T_BOOK.AUTHOR_ID = a.ID);
Et comment cela peut être exprimé en jOOQ:
// Alias the author table
TAuthor a = T_AUTHOR.as("a");
// Use the aliased table in the select statement
create.selectFrom(a)
.whereExists(create.selectOne()
.from(T_BOOK)
.where(T_BOOK.STATUS.equal(TBookStatus.SOLD_OUT)
.and(T_BOOK.AUTHOR_ID.equal(a.ID))))));
Hibernate, car c’est fondamentalement le standard de facto de Java et a été l’un des éléments moteurs de la création de JPA. Il dispose d’un excellent support au printemps, et presque tous les Java frameworks le prennent en charge. Enfin, GORM est un très bon emballage pour les recherches dynamiques, etc., à l’aide de Groovy.
Il a même été porté sur .NET (NHibernate) afin que vous puissiez l'utiliser là aussi.
Hibernate, parce que ça:
Quelques points sur pourquoi (et quand) utiliser ORM:
Je recommanderais d'utiliser MyBatis . C'est une couche mince au-dessus de JDBC, il est très facile de mapper des objets sur des tables tout en utilisant du SQL pur, tout est sous votre contrôle.
J'ai eu une très bonne expérience avec Avaje Ebean lorsque j'écrivais une application JavaSE de taille moyenne.
Il utilise des annotations JPA standard pour définir des entités, mais expose une API beaucoup plus simple (pas de EntityManager ni aucune de ces entités liées/détachées). Il vous permet également d’utiliser facilement des requêtes SQL ou des appels JDBC simples en cas de besoin.
Il possède également une API très agréable, fluide et sécurisée pour les requêtes. Vous pouvez écrire des choses comme:
List<Person> boys = Ebean.find(Person.class)
.where()
.eq("gender", "M")
.le("age", 18)
.orderBy("firstName")
.findList();
SimpleORM , parce que c'est simple et sans magie. Il définit toutes les structures de métadonnées dans le code Java et est très flexible.
SimpleORM fournit des fonctionnalités similaires à Hibernate en mappant les données d'une base de données relationnelle à Java objets en mémoire. Les requêtes peuvent être spécifiées en termes d'objets Java, l'identité de l'objet est alignée sur les clés de la base de données, les relations entre les objets sont conservées et les objets modifiés sont automatiquement vidés dans la base de données avec des verrous optimistes.
Mais contrairement à Hibernate, SimpleORM utilise une structure et une architecture d’objets très simples qui évitent le recours à des analyses complexes, au traitement de code octet, etc. SimpleORM est petit et transparent. Il est présenté dans deux pots de seulement 79 Ko et 52 Ko, dépendance (Slf4j). (Hibernate a une capacité de plus de 2 400 K + plus de 2 000 K de dépendants.) Cela simplifie la compréhension de SimpleORM et réduit donc considérablement les risques techniques.
Eclipse Link , pour de nombreuses raisons, mais je pense notamment qu’elle a moins de problèmes que les autres solutions de flux principales (au moins moins de problèmes).
Oh et Eclipse Link a été choisi comme implémentation de référence pour JPA 2.0.
Bien que je partage les préoccupations concernant les remplacements Java des requêtes SQL de forme libre, je pense vraiment que les personnes critiquant ORM le font en raison d'une conception d'application généralement médiocre.
Le vrai OOD est déterminé par les classes et les relations, et ORM vous fournit un mappage cohérent de différents types et objets de relations. Si vous utilisez un outil ORM et finissez par coder des expressions de requête dans le langage de requête pris en charge par la structure ORM (y compris, sans toutefois s'y limiter, Java arbres d'expression, méthodes de requête, OQL, etc.), vous faites certainement quelque chose. faux, c’est-à-dire que votre modèle de classe ne répond probablement pas à vos besoins comme il se doit. Une conception d'application propre n'a pas vraiment besoin de requêtes au niveau de l'application. J'ai récemment restructuré de nombreux projets utilisant un framework ORM de la même manière qu'ils utilisaient pour incorporer des constantes de chaîne SQL dans leur code. Au final, tout le monde était surpris de la simplicité et de la maintenance de l'ensemble de l'application, une fois que vous correspondez. votre modèle de classe avec le modèle d'utilisation. Certes, vous avez besoin d'un langage d'interrogation pour des fonctionnalités telles que la recherche, etc. dans un langage de requête dans le code de votre application. L'approche VIEW exploite également les capacités de la base de données et, via la matérialisation, peut être beaucoup plus performante que n'importe quel code SQL écrit à la main dans votre source Java. Donc, je ne vois aucune raison pour qu'une application non-triviale NE PAS utiliser ORM.