SORU
18 EYLÜL 2009, Cuma


OneToOne-ilgili bir tembel hale

Geliştirdiğimiz bu uygulama, bir manzarayı yavaş olduğunu fark ettik. Görünüm ve bir sorgu sadece veritabanında iki nesne almak için olsa bile 10 saniye sürdü Hazırda Beklet tarafından yürütülen olduğunu fark profilli. OneToMany ManyToMany ilişkiler tüm sorun bu değildi o kadar tembel. Gerçek SQL yürütülen teftiş, sorgu 80 katılır olduğunu fark ettim.

Sorunu daha inceleyerek, sorunun varlık sınıfları arasında OneToOne ManyToOne ilişkiler derin hiyerarşi neden olduğunu fark ettim. Düşündüm ki, sadece tembel onlara getirilen yapayım yani, bu sorunu çözmek gerekir. Ama ya @OneToOne(fetch=FetchType.LAZY) @ManyToOne(fetch=FetchType.LAZY) notlar işe yaramıyor gibi görünüyor. Ya da bir istisna olsun ya da o aslında bir proxy nesnesi ile değiştirilir ve böylece tembel değiller.

Bu iş için alacağım nasıl herhangi bir fikir? persistence.xml ilişkiler veya yapılandırma ayrıntılarını tanımlamak için kullanmayın Unutmayın, her şey java kod yapılır.

CEVAP
18 EYLÜL 2009, Cuma


İlk olarak, bazı açıklamalarKLEgüçlü 'in cevabı:

  1. Kısıtsız (null) bire bir dernek bayt kodu gereçleri olmadan vekalet edilemez sadece bir tanesidir. Bu nedenle bu varlık sahibi olduğunu bilmek ister dernek özellik içermelidir bir proxy nesnesi veya NULL olmaz, olamaz belirleyen bakarak onun temel tablo sütunları nedeniyle bire bir normal olmak eşlenen ile paylaştı PK, öyle olmalı hevesle getirilen her neyse yapma proxy anlamsız. İşte more detailed bir açıklama.

  2. bir-çok ilişkileri (ve bir-çok, belli ki bu sorundan muzdarip. Sahibi varlık kolayca kendi FK kontrol edebilirsiniz (ve bir çok durumda, boş toplama proxy başlangıçta oluşturulan ve isteğe bağlı doldurulur), dernek tembel olabilir.

  3. Bire-çok bire-bir değiştirme hemen hemen hiç iyi bir fikir değil. Çok-bir ama diğer vardır (belki) daha iyi benzersiz seçenekleri ile değiştirebilirsiniz.

Rob H.geçerli bir nokta, ancak uygulanması mümkün olmayabilir modelinize göre (bire bir dernek varsa . örneğin vardır ^em>null).

Şimdi ilk soruma gelince:

A) @ManyToOne(fetch=FetchType.LAZY) sadece iyi çalışması gerekir. Sorguda üzerine değil kendisi emin misin? Mümkün HQL ve / join fetch belirtin veya açık olarak ayarlayın sınıfı açıklama önceliklidir hangi Kriterlere API üzerinden moduna getir. Eğer durum böyle değilse ve hala sorun yaşıyorsanız, lütfen sınıflarınıza sonrası, sorgu ve SQL-konuşma daha fazla sonuç için.

B) @OneToOne yanıltıcıdır. Kesinlikle eğer null değilse, Rob ile H. önerisi gidip gibi belirtin:

@OneToOne(optional = false, fetch = FetchType.LAZY)

Veritabanı (sahibi tabloya yabancı anahtar sütun Ekle) değiştirebilirsiniz, bunu yapmak ve o harita yoksa,"": katıldı

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()

ve OtherEntity:

@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()

Eğer (ve alımlı İstekli ile yaşayamaz) yapmak için mi bayt kodu gereçleri tek bir seçenek vardır. KatılıyorumCPerkinseğer varsa , ancak -80!!!istekli OneToOne dernekler nedeniyle, daha büyük sorunların var o zaman katılır bu :-)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CZTUTORIALS

    CZTUTORIALS

    28 Ocak 2011
  • Sorikan

    Sorikan

    3 ŞUBAT 2008
  • TimMinchinLive

    TimMinchinLi

    23 ŞUBAT 2009