Résoudre le problème N 1 dans JPA et Hibernate
Le problème N 1 survient lorsque des requêtes excessives sont exécutées pour récupérer des données relationnelles. Par exemple, dans Hibernate, une requête initiale récupère N enregistrements, et N requêtes supplémentaires sont nécessaires pour récupérer les enregistrements associés à chacun.
Pour résoudre ce problème, utilisez JOIN FETCH :
List<PostComment> comments = entityManager.createQuery( "select pc from PostComment pc join fetch pc.post p where pc.review = :review" ) .setParameter("review", review) .getResultList();
Ce JOIN FETCH récupère avec impatience l'association de publication, en éliminant les requêtes N 1.
Si plusieurs associations enfants doivent être récupérées, récupérez une collection dans la requête initiale et les autres avec les requêtes suivantes.
Détection automatique
Les tests d'intégration sont idéaux pour détecter le problème N 1. Le projet db-util fournit une assertion JUnit automatique pour valider le nombre attendu d'instructions SQL générées :
@Test public void shouldNotHaveANPlusOneQuery() { // code to configure and execute db-util Assert.assertCountOfSqlStatementsPerformed(1); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!