2012-05-08 16 views
5

Estoy utilizando la versión de desarrollo local de la implementación JDO de App Engine. Cuando consulto un objeto que contiene otros objetos como campos incrustados, los campos incrustados se devuelven como nulos.El campo JDO incrustado no se recupera mediante la consulta

Por ejemplo, digamos que este es el objetivo principal que estoy persistiendo:

@PersistenceCapable 
public class Branch { 

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

    @Persistent 
    private String name; 

    @Persistent 
    private Address address; 

      ... 
} 

y esto mi objeto incrustado:

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

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

    @Persistent 
    private String street; 

    @Persistent 
    private String city; 

      ... 
} 

el siguiente código no recupera el objeto incrustado:

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

¿Alguien tiene una solución para esto? ¿Cómo puedo recuperar el objeto Branch junto con su campo Address incrustado?

Respuesta

8

Tuve un problema similar y descubrí que los campos incrustados no están incluidos en el grupo de búsqueda predeterminado. Para tener el campo requerido cargado, tendrá que llamar al getter antes de cerrar el administrador de persistencia o configurar el grupo de búsqueda para cargar todos los campos.

esto significa lo siguiente ...

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 

Por lo tanto, lo que se necesita para cambiar el código de la siguiente manera:

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

Como alternativa, puede configurar su grupo ha podido recuperar para incluir todos los campos como sigue ...

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

¡Gracias por la pronta respuesta! Voy a probar esto y te dejaré saber si funciona. – Chania

+0

Si un campo está en el grupo de búsqueda activo, obviamente debe ser recuperado. Si dices que no es así, ¿por qué no proporcionas un caso de prueba simple y lo informas en http://code.google.com/p/datanucleus-appengine/issues/list No informarlo probablemente significa que nadie involucrado en el proyecto sabrá al respecto – DataNucleus

+0

No estoy seguro de si esto es un error o una parte de la especificación JDO. Recuerdo haber leído en alguna parte que la carga lenta de campos incrustados estaba en las especificaciones JDO, pero no puedo encontrarlo ahora. – Cengiz

Cuestiones relacionadas