2012-05-08 8 views
5

App Engine'in JDO uygulamasının yerel geliştirme sürümünü kullanıyorum. Gömülü alanlar olarak başka nesneler içeren bir nesneyi sorguladığımda, katıştırılmış alanlar boş olarak döndürülür.Gömülü JDO Alanı Sorgu Tarafından Alınmadı

@PersistenceCapable 
public class Branch { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String name; 

    @Persistent 
    private Address address; 

      ... 
} 

ve bu benim gömülü nesne:

@PersistenceCapable(embeddedOnly="true") 
public class Address { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String street; 

    @Persistent 
    private String city; 

      ... 
} 

Aşağıdaki kod gömülü nesneyi almak değildir:

Örneğin, bu ben ısrarcı am ana nesnedir diyelim

PersistenceManager pm = MyPersistenceManagerFactory.get().getPersistenceManager(); 

    Branch branch = null; 
    try { 
     branch = pm.getObjectById(Branch.class, branchId); 
    } 
    catch (JDOObjectNotFoundException onfe) { 
     // not found 
    } 
    catch (Exception e) { 
     // failed 
    } 
    finally { 
     pm.close(); 
    } 

Bunun için bir çözümü olan var mı? Katıştırılmış adres alanıyla birlikte Branch nesnesini nasıl geri alabilirim?

cevap

8

Benzer bir sorunla karşılaştım ve gömülü alanların varsayılan getirme grubuna dahil edilmediğini fark ettim. Gerekli alana yüklendikten sonra, kalıcılık yöneticisini kapatmadan önce alıcıyı çağırmanız veya tüm alanları yüklemek için getirme grubunu ayarlamanız gerekecektir. Eğer senin gibi tüm alanları içerecek şekilde grubunu getirme ayarlayabilirsiniz,

Branch branch = null; 
try { 
    branch = pm.getObjectById(Branch.class, branchId); 
    branch.getAddress(); 
} 
catch (JDOObjectNotFoundException onfe) { 
    // not found 
} 
catch (Exception e) { 
    // failed 
} 
finally { 
    pm.close(); 
} 

Alternatif olarak:

Bu aşağıdaki gibi kodunuzu değiştirmeniz gerekir, Yani aşağıdaki ...

branch = pm.getObjectById(Branch.class, branchId); 
pm.close(); 
branch.getAddress(); // this is null 

branch = pm.getObjectById(Branch.class, branchId); 
branch.getAddress(); // this is not null 
pm.close(); 
branch.getAddress(); // neither is this 

demektir aşağıdaki gibidir ...

pm.getFetchPlan().setGroup(FetchGroup.ALL); 
branch = pm.getObjectById(Branch.class, branchId); 
pm.close(); 
branch.getAddress(); // this is not null 
+0

Hızlı yanıt için teşekkürler! Bunu test edip çalışıp çalışmadığını size bildiririm. – Chania

+0

Bir alan aktif getirme grubundaysa, açıkça alınmalıdır. Öyleyse neden basit bir test çantası sunmuyor ve http://code.google.com/p/datanucleus-appengine/issues/list adresinden raporlamıyorsunuz. Raporlama, muhtemelen projeye dahil olan kimsenin bilmeyeceği anlamına geliyor. bu konuda – DataNucleus

+0

Bu bir hata veya JDO belirtiminin bir parçası olup olmadığından emin değilim. Gömülü alanların tembel yüklenmesinin JDO özelliklerinde olduğunu bir yerlerde okumayı hatırlıyorum, ama şimdi bulamıyorum. – Cengiz