JPA'nın getirme stratejisi tam olarak neyi kontrol eder? Hevesli ve tembel arasında bir fark göremiyorum. Her iki durumda da, JPA / Hazırda Bekletme çoktan bire ilişkilere otomatik olarak katılmaz.
Örnek: Kişinin tek bir adresi vardır. Bir adres birçok kişiye ait olabilir. JPA açıklamalı varlık sınıfları şuna benzer:
@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 sorgusunu kullanırsam:
select p from Person p where ...
JPA / Hibernate, Kişi tablosundan seçilecek bir SQL sorgusu ve ardından her kişi için ayrı bir adres sorgusu oluşturur :
select ... from Person where ...
select ... from Address where id=1
select ... from Address where id=2
select ... from Address where id=3
Bu, büyük sonuç kümeleri için çok kötü. 1000 kişi varsa, 1001 sorgu oluşturur (1 kişiden ve 1000 adresten farklı). Bunu biliyorum çünkü MySQL'in sorgu günlüğüne bakıyorum. Anladığım kadarıyla, adresin getirme türünü istekli olarak ayarlamak, JPA / Hibernate'in bir birleştirme ile otomatik olarak sorgulamasına neden olur. Ancak, getirme türünden bağımsız olarak, yine de ilişkiler için farklı sorgular üretir.
Yalnızca ona açıkça katılmasını söylediğimde gerçekten katılır:
select p, a from Person p left join p.address a where ...
Burada bir şey mi kaçırıyorum? Artık her sorguyu, çoktan bire ilişkilere katılması için elimden geçirmem gerekiyor. Hibernate'in JPA uygulamasını MySQL ile kullanıyorum.
Düzenleme: JPA sorgularını etkilemeyen görünür ( burada ve burada Hazırda Bekletme SSS bölümüne bakın ) FetchType
. Bu yüzden benim durumumda açıkça ona katılmasını söyledim.