Pour un nouveau projet, JPA est-il toujours l'outil recommandé pour gérer les données relationnelles ou existe-t-il des scénarios où Spring JdbcTemplate est un meilleur choix? Quelques facteurs à considérer dans votre réponse:
Utilisez Spring JdbcTemplate si vous ne souhaitez pas accéder à votre schéma de base de données via un modèle de domaine. En utilisant JdbcTemplate, vous utilisez un accès de niveau inférieur, avec plus de flexibilité, mais probablement aussi plus de passe-partout.
Spring JdbcTemplate peut être plus facilement utilisé avec des schémas de base de données exotiques et un focus de procédure stockée. À l'aide de JPA, vous devez vous assurer que le schéma de la base de données correspond correctement au modèle de domaine.
Les deux technologies nécessitent que les développeurs connaissent les bases de données relationnelles, le SQL et les transactions. Avec JPA, vous obtenez une complexité plus cachée.
JPA est à ma connaissance plus facilement connectable aux couches de mise en cache des données, car le focus orienté objet facilite l'identification, la mise à jour et l'invalidation des entrées de cache.
Vous pouvez affiner mieux les backends basés sur JdbcTemplate, mais dans la plupart des cas, plus de code est impliqué.
Un autre aspect à considérer est que, bien qu'avec JPA, vous obtenez un modèle de domaine pour votre schéma de base de données, vous devrez souvent utiliser des classes DTO supplémentaires. En utilisant JdbcTemplate, vous pouvez directement opérer avec des classes DTO.
Je suis un peu en retard à ce poste, mais j'ai tendance à utiliser JdbcTemplate sur ORM. Je connais SQL (assez bien) et je ne veux vraiment pas être "abstrait" loin de ma base de données. Je trouve que la plupart du temps, mes applications utilisent des vues DB où je pousse la plupart des logiques métier jusqu'à. J'ai des DAO correctement en couches qui ont des implémentations JdbcTemplate. Il semble "propre" et la plupart du code passe-partout est caché par JdbcTemplate (et sa documentation en ligne semble BEAUCOUP mieux que les trucs ORM). Le temps limité que j'ai utilisé quelque chose comme Hibernate, j'ai trouvé que cela fonctionnait, cela me fait gagner du temps ... mais quand cela ne fonctionnait pas correctement, cela m'a coûté des jours de débogage "WTF". Je n'ai jamais eu à passer plus de 20 minutes à déboguer les implants JdbcTemplate DAO. Je pense que la clé, comme d'autres l'ont noté, est à quel point vous êtes à l'aise avec SQL/Schema Design
Je suis d'accord avec @Timo. La seule autre information que j'ajouterais/développerais est que ORM a une sémantique différente de l'accès SQL pur à vos données.
Le but d'ORM est de résumer le plus possible le fait que vos données se trouvent dans une base de données. Lorsque vous utilisez correctement ORM, toutes les opérations de persistance sont traitées dans une seule couche (espérons-le) mince. Vos objets de modèle auront peu ou pas de code de persistance; le fait que vous utilisez ORM doit être invisible pour votre modèle.
Pour cette raison, ORM est très bon pour vous faciliter la vie pour certains types d'opérations, à savoir les opérations CRUD simples. Vous pouvez charger vos objets modèles, les présenter, les mettre à jour, les supprimer assez facilement. Cela vous facilite la vie car lorsque vous accédez à vos données, vous récupérez des objets de modèle sur lesquels vous pouvez écrire une logique métier. Si vous utilisez JDBC, vous devrez "hydrater" vos instances d'objets à partir des données, ce qui peut être compliqué et sujet aux erreurs.
ORM n'est pas toujours le meilleur choix. JPA est un outil pour un travail, si l'outil n'est pas suffisant pour le travail, vous voudrez trouver un meilleur outil. Par exemple, j'avais un scénario où je devais copier un graphique d'objet entier et enregistrer une nouvelle copie de ces objets. Si j'avais utilisé ORM (comme j'ai essayé de le faire), je devais charger tous les objets de la base de données, puis les copier, puis enregistrer les nouveaux objets. J'ai pris trop de temps.
La meilleure solution consistait simplement à utiliser des opérations basées sur jdbc et à "insérer via select" des appels sql pour créer les nouvelles lignes. C'était rapide, le code était plus simple.
L'autre chose à considérer est que vous êtes à l'aise avec JDBC et que vous avez des délais, vous n'avez pas à sauter dans le train de l'ORM. Les classes Spring JdbcTemplate sont extrêmement puissantes et utiles. Parfois, le meilleur outil pour le travail est celui que vous connaissez. Vous devez vous familiariser avec ORM, mais pas nécessairement pour un projet avec des attentes élevées. Il y a beaucoup à apprendre et ce n'est pas anodin - vraiment vous échangez un ensemble de complexités avec un autre dans le choix d'utiliser jdbc vs orm.
Ce n'est pas mentionné dans les autres réponses mais c'est bien d'utiliser les deux. Dans mon application, j'utilise JPA et JdbcTemplate, pour les opérations de type crud j'utilise JPA mais pour les rapports ou lorsque c'est plus facile j'utilise jdbcTemplate.
@Repository
public class FooRepository
{
@PersistenceContext
private EntityManager entityManager;
@Autowired(required = true)
private JdbcTemplate jdbcTemplate;
public void saveFoo(Foo foo)
{
this.entityManager.persist(foo);
}
public List<SomeReportPojo> getSomeReport()
{
return this.entityManager.queryForList("SELECT .. ",SomeProjectPojo.class);
}
}
La grande chose à propos de Spring est que la traduction des exceptions des exceptions JPA à la hiérarchie d'exceptions Dao Spring fonctionne avec JPA et jdbcTemplate. Utilisez donc JPA quand cela a du sens et jdbcTemplate quand cela a du sens.
Au travail, nous utilisons Hibernate JDBCTemplate car il a plus de flexibilité. Il a également de meilleures performances que JPA car vous ne "chargez" pas beaucoup de données inutiles dans votre application.
Dans le cas JDBCTemplate, vos compétences SQL contribuent grandement à vous fournir exactement ce dont vous avez besoin à la bonne vitesse.