Mengatasi Isu N 1 dalam JPA dan Hibernate
Dalam JPA dan Hibernate, isu pertanyaan N 1 timbul apabila berbilang pertanyaan dilaksanakan kepada mendapatkan semula data berkaitan, mengakibatkan pengambilan data tidak cekap. Untuk menyelesaikan masalah ini, Hibernate menyediakan pelbagai teknik.
Memahami Masalah N 1
Isu berlaku apabila pertanyaan awal mendapatkan semula entiti utama dan pertanyaan seterusnya dicetuskan untuk mengambil data berkaitan. Contohnya, mengambil entiti PostComment tanpa mengambil awal entiti Post yang berkaitan akan memaksa Hibernate untuk melaksanakan pertanyaan tambahan untuk setiap contoh Post yang diakses.
Penyelesaian dalam Hibernate
1. Sertai Pengambilan:
Dengan menggunakan strategi "sertai ambil", data yang berkaitan boleh diambil bersama entiti utama dalam satu pertanyaan. Dalam contoh kita, kita boleh menggunakan:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
2. Prefetching Koleksi:
Apabila mengambil koleksi entiti utama dan koleksi tambahan data berkaitan, anda dinasihatkan untuk mengambil yang terakhir. Satu pilihan ialah mengambil semula koleksi dalam pertanyaan awal:
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList(); ListpostTags = entityManager.createQuery("select pt from PostTag pt where pt.post in (:commentPosts)", PostTag.class) .setParameter("commentPosts", comments) .getResultList();
3. Pertanyaan Sekunder:
Dalam kes di mana prapengambilan tidak cekap atau berbilang persatuan kanak-kanak perlu diambil, strategi pertanyaan kedua boleh digunakan. Dapatkan semula entiti utama dengan pertanyaan asas dan gunakan pertanyaan seterusnya untuk mengambil data yang berkaitan.
Pengesanan Automatik dengan db-util
Pustaka db-util menyediakan cara automatik untuk mengesan isu pertanyaan N 1. Penegasan JUnit boleh digunakan untuk mengesahkan kiraan yang dijangkakan bagi pernyataan SQL yang dijana, menangkap masalah pada awal proses pembangunan.
Atas ialah kandungan terperinci Bagaimana Anda Boleh Menangani Isu Pertanyaan N 1 dalam JPA dan Hibernate?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!