2011-04-05 29 views
7

Google App Engine'deki JDO nesnelerini tanımlamak için Key türünü kullanıyorum. İyi çalışıyor, ancak bu URL'ler aracılığıyla geçmek gerektiğinde, uzun bir süre alır. ÖrneğinApp Engine tanımlayıcısı. Anahtar vs Kimlik

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

benim yönetici izleyicide benim varlıkları görüntülerken veri deposu da bir artışlı sayısal değer gibi görünüyor benim varlık nesnesi, bir "id" teşkil ettiği Görebildiğim Anahtar dizesine göre oldukça kısa. Bunu nesnem hakkında bilgi almak için kullanabilir miyim? Bunu nasıl yaparım? Anahtar yerine getObjectbyId() kullanmayı denedim ... çalışmaz.

Herhangi bir fikrin var mı?

+0

Kullandığınız kodu, kimliğine göre almayı dener misiniz? – Yasser

cevap

9

Evet, bunu yapabilirsiniz. Kimliği almanız gerektiğinde, aşağıdaki yöntem çağrısını kullanabilirsiniz. Varlık sınıfı User'un user: user.getKey().getId() adında bir nesnesini kullandığınızı varsayalım. Kimlik, long tipindedir. Daha fazla bilgi için JavaDoc'un com.google.appengine.api.datastore.Key'a bakın.

ID'ye sahip olduğunuzda, Key'u buradan oluşturabilir ve sonra nesneyi sorgulayabilirsiniz.

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

"id" aslında bir dizedir ve veri dosyasında "ID/Name" sütununun altında görünen değerdir. Kodunuzun bununla kullanılması işe yaramıyor. Şöyle bir şey elde edersiniz: ''Kullanıcı' anahtarına sahip kullanıcı alınamadı. Kullanıcı (" 50 ")' –

+1

Burada gördükleriniz şifre çözülmüş varlık anahtarıdır. Bunu yapmadıysanız, denetleyici kodunuzda (örneğin, Servlet) ID parametresi dizesini ayrıştırmanız gerekir. Böyle bir şey bir Servlet: 'Long.parseLong (httpServletRequest.getParameter (" id ")' de çalışacaktır. Veri deposu görüntüleyicide kimlik 50 olan bir varlık görüyor musunuz? –

+0

Üzgünüm, benim hatam. türün adı) anahtar oluştururken yukarıdaki kodu düzeltin. –

2
Bir birincil anahtar olarak Varlık içinde kimliği tanımlamak gerekir

:

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

Sonra bu deneyebilirsiniz:

long id = someObject.getId(); 

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

Sorumumda belirtildiği gibi anahtarım için "Uzun" yerine "Anahtar" türünü kullanıyorum. –