2012-05-08 7 views
5

Ich verwende die lokale Entwicklung Version von App Engine JDO-Implementierung. Wenn ich ein Objekt abfrage, das andere Objekte als eingebettete Felder enthält, werden die eingebetteten Felder als null zurückgegeben.Eingebettete JDO-Feld wird nicht von Abfrage abgerufen

Zum Beispiel können sagen, dass dies das Hauptziel ist, dass ich persistierenden bin:

@PersistenceCapable 
public class Branch { 

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

    @Persistent 
    private String name; 

    @Persistent 
    private Address address; 

      ... 
} 

und das ist mein eingebettetes Objekt:

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

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

    @Persistent 
    private String street; 

    @Persistent 
    private String city; 

      ... 
} 

der folgende Code abrufen nicht das eingebettete Objekt:

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

Hat jemand eine Lösung dafür? Wie kann ich das Branch-Objekt zusammen mit seinem eingebetteten Adressfeld abrufen?

Antwort

8

Ich hatte ein ähnliches Problem und festgestellt, dass eingebettete Felder sind nicht in der Standard-Fetch-Gruppe enthalten. Um das erforderliche Feld laden zu können, müssen Sie entweder den Getter aufrufen, bevor Sie den Persistenz-Manager schließen, oder die Abruf-Gruppe so einstellen, dass alle Felder geladen werden.

Das bedeutet, die folgende ...

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 

So würden Sie Ihren Code ändern müssen, wie folgt:

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

Alternativ können Sie Ihre Set-Gruppe holen, um alle Felder zu enthalten, wie folgt ...

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

Danke für die schnelle Antwort! Ich werde das testen und Sie wissen lassen, ob es funktioniert. – Chania

+0

Wenn ein Feld in der aktiven Fetch-Gruppe ist, dann sollte es offensichtlich abgerufen werden. Wenn Sie sagen, dass dies nicht der Fall ist, dann stellen Sie einen einfachen Testfall bereit und melden Sie ihn unter http://code.google.com/p/datanucleus-appengine/issues/list. Wenn Sie dies nicht melden, bedeutet dies, dass niemand am Projekt beteiligt ist darüber – DataNucleus

+0

Ich bin mir nicht sicher, ob dies ein Fehler oder ein Teil der JDO-Spezifikation ist. Ich erinnere mich, irgendwo gelesen zu haben, dass das Laden von eingebetteten Feldern in den JDO-Spezifikationen lag, aber ich kann es jetzt nicht finden. – Cengiz