Menangani Isu Pertanyaan N 1 dalam JPA dan Hibernate
Masalah N 1 timbul apabila pertanyaan mendapatkan semula N rekod dan pertanyaan berikutnya diambil berkaitan rekod, membawa kepada N pertanyaan tambahan. Ini boleh berlaku dalam Hibernate apabila perkaitan tidak diambil semasa pertanyaan awal.
Punca dan Kesan
Untuk menggambarkan, pertimbangkan pertanyaan JPA ini yang mendapatkan semula entiti PostComment:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
Jika kami kemudiannya mengulangi ulasan dan mengakses perkaitan siaran, Hibernate akan mengeluarkan pernyataan SQL berikut:
SELECT pc.id AS id1_1_, pc.post_id AS post_id3_1_, pc.review AS review2_1_ FROM post_comment pc WHERE pc.review = 'Excellent!' INFO - Loaded 3 comments SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_ FROM post pc WHERE pc.id = 1 INFO - The post title is 'Post nr. 1' SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_ FROM post pc WHERE pc.id = 2 INFO - The post title is 'Post nr. 2' SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_ FROM post pc WHERE pc.id = 3 INFO - The post title is 'Post nr. 3'
Di sini, tiga pertanyaan tambahan dilaksanakan untuk mengambil entiti Post untuk setiap Komen. Ini ialah isu pertanyaan N 1.
Resolusi
Untuk menyelesaikannya, kami boleh mengambil perkaitan yang diperlukan dengan penuh semangat menggunakan kata kunci JOIN FETCH:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post p where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
Untuk berbilang persatuan kanak-kanak, disyorkan untuk mengambil satu koleksi dalam pertanyaan awal dan memuatkan selebihnya melalui pertanyaan kedua.
Pengesanan Automatik
Untuk mengesan N 1, adalah berfaedah untuk melaksanakan ujian penyepaduan dengan pengelogan SQL dan menegaskan untuk mengesahkan bilangan jangkaan penyata SQL yang dijana. Alat seperti db-util boleh membantu dalam proses ini.
Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Menangani Isu Pertanyaan N 1 dalam JPA dan Hibernate?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!