Merhaba,

Hibernate,JSF ve PrimeFaces kullanıyorum ve bazı bağlı entitylerimde(ManyToOne) aşağıdaki gibi tanımlama yapmadığımda

@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "HESAPLAR_ID")
    public Hesaplar getHesaplarId() {
        if (hesaplarId == null) {
            hesaplarId = new Hesaplar();
        }
        return this.hesaplarId;
    }

Target Unreachable, 'null' returned null hatası fırlatıyor. Bu şekilde kullanmam sorun oluşturur mu veya farklı bir şekilde bundan nasıl kurtulabilirim?

xhtml de şu şekilde kullanıyorum

    <p:inputText id="hesapAdi" value="#{bean.selected.hesaplarId.hesapAdi}" 
size="75" readonly="true"/>

Yardımlarınız için şimdiden teşekkürler.

soruldu: 17 Şub '15, 08:32

kurtomerfaruk's gravatar image

kurtomerfaruk
1.3k222940
cevap kabul oranı: 29%

getter içine logic yazmak helede jsf varsa pek mantıklı değil. View render ederken JSf katmanlarında 2-3 defa bu kontrole girip, 3 ayrı obje yaratması anlamına geliyor.

public Hesaplar getHesaplarId() { return hesaplarId; }

olmalı eğer null gelmemesi gerekiyorsa bunu criteria tarafında fetch etmelisiniz ilişki manytoone olduğu için cem hoca eager olduğunu default değerin belirtmiş criteria'dan fetch etmeyede gerek yok ;)

(07 May '15, 11:42) Turgay Can Turgay%20Can's gravatar image

Entity class'larinizda dogru tanimlamalar yaparsaniz performans problemleri yasamassiniz. Ornek olarak veritabaninizda Adres ve Ulke tablolari olsun.

// adres entity icinde ulke tanimi, 
// default fetch = FetchType.EAGER, o yuzden asagida yazilmadi.
@JoinColumn(name = "ulke_id", referencedColumnName = "ulke_id", nullable = false)
@ManyToOne(optional = false)
private Ulke ulke;

// ulke entity icinde adres tanimi, 
// default fetch = FetchType.LAZY, o yuzden asagida yazilmadi.
@OneToMany(cascade = CascadeType.ALL, mappedBy = "ulke")
private List<adres> adresList;

@OneToMany tanimlari default FetchType.LAZY tanimlanir ve EntityManager lazim oldugunda bu degerleri getirir. Ulke listesini okurken hangi ulke hangi adreste kullanilmis gibi bir ters liste islemi genelde gerekli degildir, o yuzden LAZY kullanilmasi performans icin iyidir, sonucta listede binlerce kayit olabilir!

@ManyToOne tanimlari default FetchType.EAGER tanimlanir ve EntityManager ilk okurken bu objeleri hemen getirir. Adresleri okurken adres class intance'i icinde direk ulke class instance'i olmasi performans sorunu olusturmaz, sonucta bir tane obje getirilir ve cogunlukla o objeye direk ihtiyaciniz olur.

JSF kullaniminda: Managed veya Named Beans icinde @ManyToOne direk EAGER yuklenildigi icin direk kullanilabilir. NullPointerException almassiniz.

<p:inputText id="ulkeAdi" value="#{bean.selected.ulke.name}" size="75" readonly="true"/>

JSF icinde ulke entity listesini okuyup getAdresList yaparsaniz NullPointerException, LazyLoadingException problemleri yasarsiniz. Bunun sebebi Service icinde EntityManager ile objeleri okudunuz ve Controller'e donderdiniz ve EntityManager session artik Controller icinden ulasilamaz! Liste kullanimlarinda EJB service icinde istenilen Listeyi okuyup controller'e dondermelisiniz.

Yapi su sekilde olmali:

Entity Bean => Repository veya DAO => Service (EJB veya Spring Bean) => Controller (Managed veya Named Bean)

permanent link

cevaplandı: 17 Şub '15, 18:53

CemIkta's gravatar image

CemIkta ♦
19.9k29125190
cevap kabul oranı: 36%

Hocam açıklamalarınız için çok teşekkür ederim. Dolayısıyla tek problem yapi kaliyor galiba ben Yapida da Generic kullanıyorum onu da oturtamadım demekki.

(18 Şub '15, 04:30) kurtomerfaruk kurtomerfaruk's gravatar image

Merhabalar kurtomerfaruk entity tanımlarınız için bence bu şekilde tanımlamalar yapmayın ayrıca Lazy olarak tanımladıktan sonra bahsettiğiniz sorundan yani Target Unreachable, 'null' returned null hatasından kurtulmak istiyorsanız hibernate configuration yaptığınız yere şu satırı eklerseniz.Hem eğer bu hatadan dolayı Eager yapıyorsanız kurtulursunuz hemde LAZY yaparak daha performanslı bir application elde etmiş olursunuz.

<prop key="hibernate.enable_lazy_load_no_trans">true</prop>

getHesaplarId() { if (hesaplarId == null) { hesaplarId = new Hesaplar(); } return this.hesaplarId; }

permanent link

cevaplandı: 07 May '15, 09:47

caglarturkurka's gravatar image

caglarturkurka
6653712
cevap kabul oranı: 6%

1

Denedim ama bir değişiklik oluşmadı. Yapıyı değiştirdim o şekilde çözdüm @CemIkta'nın yardımları ile

(08 May '15, 09:15) kurtomerfaruk kurtomerfaruk's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×281
×109
×97

Soruldu: 17 Şub '15, 08:32

Görüntüleme: 702 kez

Son güncelleme: 08 May '15, 09:16

powered by BitNami OSQA