2011-04-05 9 views
7

Para identificar mis objetos JDO en Google App Engine utilizo el tipo Key. Funciona bien, pero cuando necesito pasar esto a través de las URL, se pone más o menos largo.Identificador de App Engine. Clave vs Id.

Por ejemplo: http://mysite.com/user/aghtaWx1LWFwcHIZCxIGTXlVc2VyGAMMCxIHTXlJbWFnZRgHDA

Al ver mis entidades en mi visor de administración Puedo ver que el almacén de datos también establece un "id" para mi objeto de entidad, lo que parece ser un valor numérico incremental, que suele bastante corto en comparación con la cadena clave. ¿Puedo usar esto para obtener información sobre mi objeto? ¿Cómo hago esto? Intenté usar getObjectbyId() con el id en lugar de la clave ... no funciona.

¿Alguna idea?

+0

Se puede publicar el código que utilizó para tratar de conseguir por id? – Yasser

Respuesta

9

sí, se puede hacer eso. Siempre que necesite obtener la identificación, puede usar la siguiente llamada a método. Supongamos que está utilizando un objeto de la clase de entidad User llamada user: user.getKey().getId(). La identificación es del tipo long. Vea el JavaDoc de com.google.appengine.api.datastore.Key para más información.

Cuando tenga la identificación, puede compilar la Key y simplemente hacer una búsqueda para el objeto.

Key key = KeyFactory.createKey("User", id); 
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
User user = datastore.get(key); 
+0

El 'id' es en realidad una cadena, y es el valor que está visible en el data-store debajo de la columna' ID/Name'. Usar tu código con eso no funciona. Obtengo algo así como: 'No se pudo recuperar entidad de tipo Usuario con clave Usuario (" 50 ")' –

+1

Lo que ves allí es la clave de entidad descodificada. Si no lo ha hecho, debe analizar el parámetro de ID String en su código de controlador (por ejemplo, Servlet). Algo así funcionaría en un Servlet: 'Long.parseLong (httpServletRequest.getParameter (" id ")'. ¿Ves una entidad con ID 50 en el visor del almacén de datos? –

+0

Lo siento, es mi culpa. Tienes que usar un String (nombre del tipo de entidad) al crear la clave. Corregí el código anterior. –

2

Usted tendrá que definir el identificador en su entidad como una clave principal:

private class MyObject implements Serializable{ 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 
} 

entonces usted puede probar esto:

long id = someObject.getId(); 

MyObject mo = getPM().getObjectById(MyObject.class, id); 
+0

Como dije en mi pregunta, estoy usando el tipo "Clave" en lugar de "Largo" para mi clave. –