Rumah > Java > javaTutorial > Bagaimanakah Kami Boleh Menangani Isu Pertanyaan N 1 dalam JPA dan Hibernate?

Bagaimanakah Kami Boleh Menangani Isu Pertanyaan N 1 dalam JPA dan Hibernate?

Susan Sarandon
Lepaskan: 2024-11-13 06:26:02
asal
1085 orang telah melayarinya

How Can We Address the N 1 Query Issue in JPA and Hibernate?

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();
Salin selepas log masuk

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'
Salin selepas log masuk

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();
Salin selepas log masuk

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!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan