Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

App Engine identifier. Key vs Id

To identify my JDO objects in Google App Engine I use the Key type. It works fine but when I need to pass this through urls it gets sort of long.

For example: http://mysite.com/user/aghtaWx1LWFwcHIZCxIGTXlVc2VyGAMMCxIHTXlJbWFnZRgHDA

When viewing my entities in my admin viewer I can see that the data-store also sets an "id" for my entity object, which seems to be an incremental numeric value, which is quite short compared to the Key string. Can I use this to grab information on my object? How do I do this? I tried using getObjectbyId() with the id instead of the key... it doesn't work.

Any ideas?

like image 787
Luca Matteis Avatar asked Apr 05 '11 14:04

Luca Matteis


2 Answers

Yes, you can do that. Whenever you need to get the ID you can use the following method call. Assume you are using an object of the entity class User named user: user.getKey().getId(). The id is of type long. See the JavaDoc of com.google.appengine.api.datastore.Key for more information.

Whenever you have the ID you can build the Key from it and then simply query for the object.

Key key = KeyFactory.createKey("User", id);
DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
User user = datastore.get(key);
like image 105
Benjamin Muschko Avatar answered Sep 29 '22 20:09

Benjamin Muschko


You will need to define the id in your Entity as a primary key:

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

Then you can try this:

long id = someObject.getId();

MyObject mo = getPM().getObjectById(MyObject.class, id);
like image 32
Yasser Avatar answered Sep 29 '22 20:09

Yasser