2012-05-08 9 views
5

Sto utilizzando la versione di sviluppo locale dell'implementazione JDO di App Engine. Quando interrogo un oggetto che contiene altri oggetti come campi incorporati, i campi incorporati vengono restituiti come null.Il campo JDO incorporato non viene recuperato dalla query

ad esempio, consente dire che questo è l'oggetto principale che sto persistente:

@PersistenceCapable 
public class Branch { 

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

    @Persistent 
    private String name; 

    @Persistent 
    private Address address; 

      ... 
} 

e questo il mio oggetto incorporato:

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

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

    @Persistent 
    private String street; 

    @Persistent 
    private String city; 

      ... 
} 

il seguente codice non recupera l'oggetto incorporato:

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

Qualcuno ha una soluzione per questo? Come posso recuperare l'oggetto Branch insieme al suo campo Indirizzo incorporato?

risposta

8

Ho riscontrato un problema simile e ho riscontrato che i campi incorporati non sono inclusi nel gruppo di recupero predefinito. Per avere il campo richiesto caricato dovrai chiamare il getter per questo prima di chiudere il gestore di persistenza o impostare il gruppo di recupero per caricare tutti i campi.

implicano che ...

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 

Quindi, si avrebbe bisogno di modificare il codice come segue:

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

In alternativa, è possibile impostare il recupero di gruppo per includere tutti i campi come segue ...

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

Grazie per la pronta risposta! Lo metterò alla prova e ti faccio sapere se funziona. – Chania

+0

Se un campo si trova nel gruppo fetch attivo, deve ovviamente essere prelevato. Se dici che non è così, perché non fornire una semplice testcase e segnalarlo su http://code.google.com/p/datanucleus-appengine/issues/list Non riportarlo probabilmente significa che nessuno coinvolto nel progetto saprà su di esso – DataNucleus

+0

Non sono sicuro se questo è un bug o una parte delle specifiche JDO. Ricordo di aver letto da qualche parte che il caricamento lento dei campi incorporati era nelle specifiche JDO, ma non riesco a trovarlo ora. – Cengiz

Problemi correlati