การควบคุมกลยุทธ์การดึงข้อมูลของ JPA คืออะไร? ฉันไม่สามารถตรวจพบความแตกต่างระหว่างความกระตือรือร้นและขี้เกียจ ในทั้งสองกรณี JPA / Hibernate จะไม่เข้าร่วมความสัมพันธ์แบบกลุ่มต่อหนึ่งโดยอัตโนมัติ
ตัวอย่าง: บุคคลมีที่อยู่เดียว ที่อยู่อาจเป็นของคนจำนวนมาก คลาสเอนทิตีที่มีคำอธิบายประกอบ JPA มีลักษณะดังนี้:
@Entity
public class Person {
@Id
public Integer id;
public String name;
@ManyToOne(fetch=FetchType.LAZY or EAGER)
public Address address;
}
@Entity
public class Address {
@Id
public Integer id;
public String name;
}
ถ้าฉันใช้แบบสอบถาม JPA:
select p from Person p where ...
JPA / Hibernate สร้างแบบสอบถาม SQL หนึ่งรายการเพื่อเลือกจากตารางบุคคลจากนั้นแบบสอบถามที่อยู่ที่แตกต่างกันสำหรับแต่ละคน:
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
สิ่งนี้แย่มากสำหรับชุดผลลัพธ์ขนาดใหญ่ หากมี 1,000 คนจะสร้างแบบสอบถาม 1001 รายการ (1 จากบุคคลและ 1,000 คนที่แตกต่างจากที่อยู่) ฉันรู้สิ่งนี้เพราะฉันกำลังดูบันทึกการสืบค้นของ MySQL ฉันเข้าใจว่าการตั้งค่าประเภทการดึงข้อมูลของที่อยู่ให้กระตือรือร้นจะทำให้ JPA / Hibernate ค้นหาโดยอัตโนมัติด้วยการเข้าร่วม อย่างไรก็ตามไม่ว่าจะดึงข้อมูลประเภทใดก็ยังคงสร้างแบบสอบถามที่แตกต่างกันสำหรับความสัมพันธ์
เมื่อฉันบอกอย่างชัดเจนให้เข้าร่วมเท่านั้นที่จะเข้าร่วม:
select p, a from Person p left join p.address a where ...
ฉันขาดอะไรที่นี่? ตอนนี้ฉันต้องเขียนโค้ดด้วยมือทุกแบบสอบถามเพื่อให้เหลือรวมความสัมพันธ์แบบกลุ่มต่อหนึ่ง ฉันใช้การใช้งาน JPA ของ Hibernate กับ MySQL
แก้ไข:ปรากฏขึ้น (ดูคำถามที่พบบ่อยของไฮเบอร์เนตที่นี่และที่นี่ ) ซึ่งFetchType
ไม่ส่งผลต่อการค้นหาของ JPA ดังนั้นในกรณีของฉันฉันบอกให้เข้าร่วมอย่างชัดเจน