物化多对一与家长和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的理解。

+0

可能重复http://*.com/questions/9750650/gwt-requestfactory-entity-locator-does-not -object-h-h) – 2012-03-31 09:10:44

+0

你是对的 - 我没有在搜索中看到 - 我使用该页面中的链接来解决这个问题http:// nimbustecnologia .blogspot.com/2011/01/requestfactory-objectify.html - 谢谢 – 2012-03-31 19:29:28

你需要实现自己的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的。

它不必是唯一LongRequestFactory 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)。一个是父母,另一个是呃。

+0

我很困惑 - 在请求工厂定位器类中,重写的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(的