arkadaşlar merhaba one-to-many koyduktan sonra fetch type ına EAGER koyunca sorun çıkartmıo lazy de no session var closed dio lazy sanırım kullanırken veritabanından çekio die biliodum eager hemen çekio du sanırım bunun nasıl halledebilirim?

soruldu: 28 Nis '12, 08:21

scarface_tnt's gravatar image

scarface_tnt
178364348
cevap kabul oranı: 11%

değiştirildi: 28 Nis '12, 08:27

%C3%B6zcanacar's gravatar image

özcanacar ♦♦
17.2k59183183


JPA'da ilişkisel verinin çekilmesinde fetch stratejisi olarak eager belirtilmişse, ilişkinin bir tarafındaki nesne çekildiğinde, bu nesne ile ilişkili diğer nesnelerde çekilir.

Fetch stratejisi lazy olduğunda ise, bir tarafındaki nesne yüklendiğinde, ilişkili diğer nesneler çekilmez. JPA'da OneToMany ilişkilerde default fetch stratejisi lazy'dir.

Dolayısıyla strateji lazy olduğunda, çekilen nesne üzerinden ilişkili diğer nesnelere ulaşmaya çalıştığınızda bir LazyInitializationException istisnası fırlatılır. Zira nesnenin çekimi/load işlemi tamamlanmış ve EntityManager, transaction yönetimi gereği kapatılmıştır.

Melih Sakarya hocamızın fetch stratejileri ve eager kullanılmadığında fetch sorgularını nasıl kullanabileceğinize dair güzel bir makalesi var, okumanızı tavsiye ederim: http://www.melihsakarya.com/2011/12/jpa-fetch-stratejileri-ve-lazy-loading/

permanent link

cevaplandı: 28 Nis '12, 15:03

hakdogan's gravatar image

hakdogan
2.1k31926
cevap kabul oranı: 43%

LAZY : Tembel yükleme, asıl nesne çağırımı sonrasında lazy ilişkili nesnelerden bilgi getirilmez. Bilgiyi ancak ilişkili nesnenin çağırımı ile birlikte getirir.

işte ben de ilişikli nesnenin çağrımı ile birlikte getirmek istosam ne yapmam gerekio? çünkü bunun yapmıcaksam lazy kullanmamın hiç bir mantığı yok. ve şimdi bunun yaptığımda LazyInitializationException bu hatayı yiyorum :(

(29 Nis '12, 04:12) scarface_tnt scarface_tnt's gravatar image
1

@scarface_tnt Bazı kavramları yerine oturtmak gerekiyor. Fetch statejisi olarak(FetchType) Lazy belirlenmesi, ilişkinin bir tarafındaki nesneye her erişildiğinde, çok tarafındaki nesnelerin çekiminin gerekli olmadığı durumlarda tercih edilmeli. Siz, bir tarafındaki nesneyi her çektiğinizde, çok tarafındaki nesnelere de ihtiyaç duyuyorsanız FetchType EAGER olmalı. FetchType Lazy olduğunda, sorgu ile ilişkileri nasıl çekebileceğiniz paylaştığım makalede örneklendiriliyor. Göz attınız mı?

(29 Nis '12, 05:59) hakdogan hakdogan's gravatar image

az önce de baktım şimdi tekrar baktım açıkcası örneklendiriliyor dediğin yeri ben bi türlü bulamadım en sonra sadece LazyInitializationException hatasından bahsetmiş bu hata meydana gelior bende de entitymanager ın kapatılmasından bahsetmiş bende de session closed meydana gelio sanırım benzer bi durum ama çözümü için ne yapmam gerektiğini hala anlamadım :( ayrıca bnm amacımda şu ilişiki veri çekecekken sadece ait nesneyi çekicem lazy kullanmam mantıklı ama ilişikili nesneleri çekme ihtimalim de olabilir eager kullanırsam da performans sanırım yerlerde olur.

permanent link

cevaplandı: 29 Nis '12, 06:42

scarface_tnt's gravatar image

scarface_tnt
178364348
cevap kabul oranı: 11%

Makalede "Fetch Sorgular" kısmı aradığın çözümü içeriyor. Şimdi örneklendirmem gerekirse, aralarında OneToMany ilişki olan A ve B nesneleri söz konusu olsun. A bir tarafı, B çok tarafı ve FetchType Lazy. Bu örnekte sen, A ile ilişkili B nesneleri db'den çekmek istiyorsun. O vakit şöyle bir sorgu, A ile ilişkili B nesnelerini çekecektir: em.createQuery("SELECT b FROM B b JOIN fetch b.a").getResultList(); Bu sorguda görülen "b.a" ifadesi, B tablosundaki A tablosuna ait yabancı anahtardır...

(29 Nis '12, 06:51) hakdogan hakdogan's gravatar image

hmm şimdi anladım ben çözümü daha farklı arıodum açıkcası session ı açık tutmak gibi felan bişi bekliodum query yazmak hiç tahmin etmediğim bişeydi çok teşekkür ederim uğraştırdım biraz ii çalışmalar :))

(29 Nis '12, 07:37) scarface_tnt scarface_tnt's gravatar image
Cevabınız
toggle preview

powered by BitNami OSQA