2015-12-10 21 views
5

'da beklendiği gibi çalışmazsa, JPA ile biraz daha fazla bir çerçeve anlamaya çalıştım. Eclipselink'i JPA sağlayıcısı olarak kullanıyorum.Tembel (yüklenmemiş) koleksiyonunda JPA çağrı yöntemi, Eclipselink

@OneToMany ilişkisine sahip bir kişinin (bir kişinin çok sayıda adresi var) tembel yüklü var.

Bir kişi varlığını yüklediğimde, çıkartın ve sonra (yüklenmemiş) adreslere erişmeye çalışın ... bir çekicilik olarak çalışır. Hata ayıklama yaparken, adres listesinin size() yöntemini çalıştırırken bir veritabanı sorgusunun yürütüldüğünü görebiliyorum.

Neden çalıştığını anlamıyorum. Bir çeşit istisna beklerim. Son günlerde jpa ve benzerleri hakkında epeyce kitap okudum (i. this link) ama her şey bana çalışmadığı sonucuna işaret etti.

Bunun nedenini açıklayan herhangi biri var mı?

@Stateless 
public class Test { 
    @PersistenceContext(unitName="TestPU") EntityManager em; 

    public void test() { 
     Person person = em.find(Person.class, 1); 

     System.out.println(person); 

     System.out.println("em.contains(person): " + em.contains(person); 

     em.detach(person); 

     System.out.println("em.contains(person): " + em.contains(person); 

     person.getAddresses().size(); 

     System.out.println("em.contains(person): " + em.contains(person); 

     System.out.println(person); 

    } 
} 

sonuç günlük

DEBUG: SELECT ... from PERSON WHERE (id = ?) 
Person{id=1, name=Test, addresses={IndirectList: not instantiated}} 
em.contains(person): true 
em.contains(person): false 
DEBUG: SELECT ... FROM ADDRESSES where (address_fk = ?) 
em.contains(person): false 
Person{id=1, name=Test, addresses={[Address{id=10, city=Testcity}]}} 
+3

Çünkü EclipseLink ile nesneler, JPA özelliklerinin (yani, DB'den ayırma) amaçladığı şekilde nesneleri "ayırma" değiller, bu nedenle bağlantı bilgisini korurlar. gerçekten "müstakil"). Aynı işlemi diğer JPA sağlayıcılarında yapmış olsaydınız, bir alan ayrılmamışsa, genellikle bir istisna atarlardı. –

+0

[em.contains] numaralı telefonu arayarak doğru şekilde ayrılırsa, kontrol edebilirsiniz (http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#contains%28java.lang.Object % 29) –

cevap

1

olarak artık yönetilmektedir böylece here ayırmak bağlamdan Varlık kaldırır tarif olurdu. Yine de içerik hala kullanılabilir olduğundan, ihtiyaç duyulmadığında tembel olmayan tembel koleksiyonlar hala getirilebilir ve EclipseLink bunu istisna atmaktan daha değerli hisseder. Bu, EclipseLink'in bir özelliği olarak kabul edilir ve JPA tarafından, diğer sağlayıcıların davranışı varsayılan olarak etkinleştirmemesine rağmen izin verilir.

+0

Açıklama için teşekkürler. Ben JPA spec bu beahviour izin veriyorum emin olmasa da. Ben özellikleri okuyan bir uzman değilim, ama aşağıdaki alıntı davranışa göre bu davranışa izin vermez. 'İlişkili bir örneğin mevcut durumu varsa, güvenli bir şekilde erişilemez.' (JSR 338 bölüm 3.2. 7 Müstakil Varlıklar) – Filou

+0

Bu davranış tanımlanmamışsa, bir istisna gerektirmez ve EclipseLink, belirtim için başvuru kaynağıdır. Varlıklara herhangi bir zamanda serileştirilebileceği, daha sonra da içeriğe olan bağlantının kesildiği (hala açık olsa bile), ilişkiye erişmek güvenli değildir. – Chris

+0

Haklısınız, yasak değildir. _must not_ yok. Okumayı okumak için biraz daha alışmalıyım. Açıklama için tekrar teşekkür ederiz! – Filou