'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}]}}
Çü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ı. –
[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) –