2012-05-08 10 views
5

Korzystam z lokalnej wersji rozwojowej implementacji JDO App Engine. Kiedy wysyłam zapytanie do obiektu, który zawiera inne obiekty jako pola osadzone, pola osadzone są zwracane jako puste.Wbudowane pole JDO nie jest pobierane przez zapytanie

Na przykład, powiedzmy, że jest to główny cel, że jestem utrzymujących:

@PersistenceCapable 
public class Branch { 

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

    @Persistent 
    private String name; 

    @Persistent 
    private Address address; 

      ... 
} 

a to mój obiekt osadzony:

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

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

    @Persistent 
    private String street; 

    @Persistent 
    private String city; 

      ... 
} 

następujący kod nie odzyskać obiekt osadzony:

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(); 
    } 

Czy ktoś ma rozwiązanie tego problemu? Jak mogę pobrać obiekt Branch wraz z jego osadzonym polem Address?

Odpowiedz

8

Miałem podobny problem i okazało się, że osadzone pola nie są uwzględnione w domyślnej grupie pobierania. Aby załadować wymagane pole, musisz albo wywołać procedurę pobierającą, zanim zamkniesz menedżera utrwalania, albo ustawić grupę pobierania, aby załadowała wszystkie pola.

Oznacza to Po ...

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 

Więc trzeba by zmienić swój kod w następujący sposób:

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

Alternatywnie, możesz ustawić sprowadzić grupę obejmować wszystkie dziedziny, jak podąża za ...

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

Dzięki za szybką odpowiedź! Sprawdzę to i dam znać, czy to działa. – Chania

+0

Jeśli pole znajduje się w aktywnej grupie pobierania, to oczywiście powinno zostać pobrane. Jeśli powiesz, że nie jest, to dlaczego nie dostarczyć prostej wersji testowej i zgłosić ją na http://code.google.com/p/datanucleus-appengine/issues/list. Nie zgłoszenie jej prawdopodobnie oznacza, że ​​nikt zaangażowany w projekt nie będzie wiedział o tym – DataNucleus

+0

Nie jestem pewien, czy jest to błąd, czy też część specyfikacji JDO. Pamiętam, że przeczytałem gdzieś, że leniwy ładunek osadzonych pól był w specyfikacji JDO, ale nie mogę go teraz znaleźć. – Cengiz

Powiązane problemy