ในลิงค์นี้ฉันกล่าวถึงก่อนหน้านี้ในความคิดเห็นอ่านส่วนนี้:
การเข้าร่วม "ดึง" ช่วยให้การเชื่อมโยงหรือคอลเลกชันของค่าที่จะเริ่มต้นพร้อมกับวัตถุแม่ของพวกเขาโดยใช้การเลือกเพียงครั้งเดียว สิ่งนี้มีประโยชน์อย่างยิ่งในกรณีของการรวบรวม มันจะแทนที่การประกาศการรวมภายนอกและการประกาศอย่างขี้เกียจของไฟล์การแมปสำหรับการเชื่อมโยงและการรวบรวม
"เข้าร่วม FETCH" นี้จะมีผลถ้าคุณมีคุณสมบัติ (fetch = FetchType.LAZY) สำหรับคอลเลกชันภายในเอนทิตี (ตัวอย่างร้อง)
และจะมีผลเฉพาะกับวิธีการ "เมื่อแบบสอบถามควรเกิดขึ้น" และคุณต้องรู้สิ่งนี้ด้วย :
ไฮเบอร์เนตมีสองแนวคิดมุมฉาก: เมื่อมีการดึงความสัมพันธ์และวิธีการดึง เป็นสิ่งสำคัญที่คุณจะไม่สับสน เราใช้การดึงข้อมูลเพื่อปรับแต่งประสิทธิภาพ เราสามารถใช้สันหลังยาวเพื่อกำหนดสัญญาสำหรับข้อมูลที่มีอยู่ในอินสแตนซ์ที่แยกออกของคลาสเฉพาะ
สมาคมถูกดึงข้อมูล -> ประเภท "FETCH" ของคุณเมื่อใด
มันเป็นวิธีการ -> เข้าร่วม / เลือก / Subselect / แบทช์
ในกรณีของคุณ FETCH จะมีผลก็ต่อเมื่อคุณมีแผนกเป็นชุดภายในพนักงานบางสิ่งเช่นนี้ในเอนทิตี:
@OneToMany(fetch = FetchType.LAZY)
private Set<Department> department;
เมื่อคุณใช้
FROM Employee emp
JOIN FETCH emp.department dep
คุณจะได้รับและemp
emp.dep
เมื่อคุณไม่ได้ใช้การดึงข้อมูลคุณยังสามารถรับได้emp.dep
แต่ไฮเบอร์เนตจะประมวลผลตัวเลือกอื่นไปยังฐานข้อมูลเพื่อรับชุดแผนกนั้น
ดังนั้นมันเป็นเพียงเรื่องของการปรับประสิทธิภาพเกี่ยวกับคุณต้องการได้รับผลลัพธ์ทั้งหมด (คุณต้องการหรือไม่) ในแบบสอบถามเดียว (กระตือรือร้นดึง) หรือคุณต้องการสอบถามมันหลังเมื่อคุณต้องการ (ขี้เกียจดึง)
ใช้ความกระตือรือร้นในการดึงข้อมูลเมื่อคุณต้องการรับข้อมูลขนาดเล็กด้วยการเลือกเพียงครั้งเดียว หรือใช้การดึงข้อมูลแบบสันหลังยาวเพื่อสืบค้นสิ่งที่คุณต้องการในภายหลัง (แบบสอบถามขนาดเล็กจำนวนมาก)
ใช้การดึงข้อมูลเมื่อ:
ไม่มีชุด / ชุดใหญ่ที่ไม่ต้องการในเอนทิตีนั้นที่คุณจะได้รับ
การสื่อสารจากแอ็พพลิเคชันเซิร์ฟเวอร์ไปยังเซิร์ฟเวอร์ฐานข้อมูลไกลเกินไปและต้องการเวลานาน
คุณอาจจะต้องคอลเลกชันที่หลังเมื่อคุณไม่ได้มีการเข้าถึงมัน ( นอกของการทำธุรกรรมวิธีการ / ชั้น)