物化多对一与家长和RequestFactory
我有一个情况 - 在我EquipmentType I类有装备检出清单物化多对一与家长和RequestFactory
List<Key<EquipmentCheckout>> field
阅读这个问题的答案后:Objectify Relationships: One-to-Many, Can I do this efficiently? - 它似乎更高效这样做,这是创建一个类名为EquipmentCheckouts它看起来像以下:
class EquipmentCheckouts
@Id
Long id
@Parent
EquipmentType equipmentType
@Indexed
List<EquipmentCheckout> equipmentCheckouts
现在 - 这就是我想知道 - 我使用RequestFactory我相信RequestFactory必须有一个发现(Long id)方法。从我为了检索EquipmentCheckouts理解与EquipmentType父对象,你就必须沿着以下的线路做一些事情:
Key<EquipmentType> key = ObjectifyService.factory().getKey(equipmentType)
return ofy.get(new Key<EquipmentCheckouts>(key, EquipmentCheckouts.class, id))
所以,如果你可以不必在找到EquipmentType(长id)方法你应该如何做到这一点?
对于我的系统一切我有一个商业父其存储在用户会话的记录,这样,当我去找回我的一切,然后验证用户密钥的企业会发现无论是。我觉得好像有些事我没有正确理解在Objectify中使用@Parent的理解。
你需要实现自己的Locator将支持实体父。正如您正确指出的那样,您不能只使用长ID,因为它没有父键。我通过实现使用包含对象完整路径的组合字符串键的Locator来解决此问题。
这里最重要的是,组合键仅用于RPC。您的实体仍然使用长ID并且不必修改。
下面是代码片段:
public class PojoLocator extends Locator<DatastoreObject, String>
{
@Override
public DatastoreObject find(Class<? extends DatastoreObject> clazz, String id)
{
Key<DatastoreObject> key = Key.create(id);
return ofy.load(key);
}
@Override
public String getId(DatastoreObject domainObject)
{
if (domainObject.getId() != null)
{
Key<DatastoreObject> key = ofy.fact().getKey(domainObject);
return key.getString();
} else
return null;
}
}
你可以看到完整的版本,我的定位here的。
它不必是唯一Long
在RequestFactory interface。正如文档所说:
Built-in value types: BigDecimal, BigInteger, Boolean, Byte, Enum, Character, Date, Double, Float, Integer, Long, Short, String, Void
Custom value types: any subclass of ValueProxy
Entity types: any subclass of EntityProxy
Collections: List<T> or Set<T>, where T is one of the above value or entity types
所以你可以有两个长期:find(Long, Long)
。一个是父母,另一个是呃。
我很困惑 - 在请求工厂定位器类中,重写的find方法只需要Class ,Long - find方法只有1个参数,所以你如何实现find(Long,Long)? – 2012-03-31 17:58:45
鲁斯兰的回答是点上。它解决了父母实体的问题,仍然为根实体工作。
我在这里复制使用物化4定位器代码的情况下,这是一个任何人路过有用的更新版本。
@Override
public EntityObject find(Class<? extends EntityObject> clazz, String id) {
Key<EntityObject> key = Key.create(id);
EntityObject ob = ofy().load().key(key).now();
return ob;
}
@Override
public String getId(EntityObject domainObject) {
if (domainObject.getId() != null)
{
Key<EntityObject> key = Key.create(domainObject);
return key.getString();
} else
return null;
}
[GWT Requestfactory实体定位不与客体工作时,实体早已ID(的
可能重复http://*.com/questions/9750650/gwt-requestfactory-entity-locator-does-not -object-h-h) – 2012-03-31 09:10:44
你是对的 - 我没有在搜索中看到 - 我使用该页面中的链接来解决这个问题http:// nimbustecnologia .blogspot.com/2011/01/requestfactory-objectify.html - 谢谢 – 2012-03-31 19:29:28