SORU
20 Ocak 2009, Salı


JPA istekli getir katılın değil

Tam olarak JPA stratejisi denetim getirme nedir? İstekli ve tembel arasında herhangi bir fark tespit edemiyorum. Her iki durumda JPA/Hazırda Beklet otomatik olarak bir-çok ilişkileri katılın değil.

Örnek: bir Kişinin tek bir adresi vardır. Adresi birçok kişiye ait olabilir. Bu JPA varlık sınıfları gibi açıklamalı:

@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;
}

Eğer JPA sorgu kullanırsam:

select p from Person p where ...

JPA/Hazırda bir SQL sorgu Kişi tablodan seçmek için oluşturur, ve sonra farklı bir adres için sorguherkişi:

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ü. Eğer 1000 kişi varsa 1001 sorgular (adresinden kişiden 1 ve 1000 ayrı) oluşturur. MySQL sorgu günlük bakıyorum çünkü bunu biliyorum. Adres türü için istekli getirme ayarı JPA/otomatik olarak Hazırda bekleme ile bir birleşim sorgusu neden olacak anladığım kadarıyla. Ancak yazın fetch ne olursa olsun, yine de ilişkiler için ayrı bir sorgu oluşturur.

Ben açıkça bunu mu anlatmak katılmak için sadece gerçekten katılmak:

select p, a from Person p left join p.address a where ...

Bir şey mi kaçırıyorum? Ben şimdi birleşimler çok-bir ilişki bırakmış, böylece her sorgu kodu lazım. MySQL ile Hazırda var JPA uygulaması kullanıyorum.

Düzenleme:FetchType JPA sorgular etkisi olmadığı görünüyor (here here Uyku SSS bakınız). Benim durumumda katılmak için söylemem lazım açıkça.

CEVAP
18 HAZİRAN 2012, PAZARTESİ


JPA ek açıklamaları eşleme üzerinde herhangi bir şartname getirme stratejisini seçmek için sağlamaz. Genel olarak, ilgili kuruluşlar yollarını aşağıda belirtilen herhangi biri getirilebilir

  • SEÇİN =>kök için bir sorgu varlıklar eşlenen varlık/koleksiyon her kökün varlığı ile ilgili bir sorgu = (n 1) sorgular
  • = ^ ALT seçim . ikinci sorgu ilk sorguda = 2 sorgular alınan kök varlıklar için bir sorgu
  • = ^ KATILIN . kök varlıkları ve eşlenmiş varlık/koleksiyonlarını her ikisi de = 1 sorgu almak için bir sorgu

O yüzden SEÇ ve KATIL iki uç arasında ALT seçim düşüyor. Uygun strateji onun/onun etki modeline göre seçebilirsiniz.

Varsayılan olarak SEÇMEK hem JPA/EclipseLink ve Hazırda Beklet tarafından kullanılır. Bu kullanarak geçersiz kılınabilir

@Fetch(FetchMode.JOIN) 
@Fetch(FetchMode.SUBSELECT)

uykusuna yatarlar. Bunu da açıkça toplu iş boyutunu kullanarak ayarlanmış olabilir @Fetch(FetchMode.SELECT) kullanarak modu SEÇİN @örneğin BatchSize(boyut=10) ayarlamanızı sağlar

EclipseLink ilgili açıklamalar vardır

@JoinFetch
@BatchFetch

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hak5DarrensVlog

    Hak5DarrensV

    11 EYLÜL 2009
  • schmittastic

    schmittastic

    9 EYLÜL 2009
  • taliajoy18

    taliajoy18

    12 Temmuz 2011