【问题标题】:Objectify many to one with Parent and RequestFactory使用 Parent 和 RequestFactory 将多对一对象化
【发布时间】:2012-04-14 17:50:20
【问题描述】:

我有一个情况 - 在我的 EquipmentType 类中,我有一个设备检查列表

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 必须有一个 find(Long id) 方法。据我了解,为了检索具有 EquipmentType 父级的 EquipmentCheckouts 对象,您必须执行以下操作:

Key<EquipmentType> key = ObjectifyService.factory().getKey(equipmentType)
return ofy.get(new Key<EquipmentCheckouts>(key, EquipmentCheckouts.class, id))

那么,如果 find(Long id) 方法中没有 EquipmentType,你应该怎么做呢?

对于我系统中的所有其他内容,我有一个 Business 父级,它存储在登录的用户会话中,这样当我去检索所有内容时,我会对用户进行身份验证,然后键入业务以查找它是什么。我觉得在 Objectify 中正确使用 @Parent 有什么我不理解的地方。

【问题讨论】:

标签: google-app-engine gwt requestfactory objectify


【解决方案1】:

您需要实现自己的Locator,以支持具有父级的实体。正如您正确指出的那样,您不能只使用长 ID,因为它没有父母的密钥。我通过实现使用包含对象完整路径的复合字符串键的定位器解决了这个问题。

这里重要的是复合键仅用于 RPC。您的实体仍使用长 ID,无需修改。

这里是代码sn-p:

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

【讨论】:

    【解决方案2】:

    RequestFactory interface 中不必只有 Long。正如文档所说:

    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 extends EquipmentCheckouts>, Long - find 方法只有 1 个参数,那么您将如何实际实现 find(Long, Long)??
    【解决方案3】:

    Ruslan 的回答很准确。它解决了有父实体的问题,并且仍然适用于根实体。

    我在这里复制了使用 Objectify 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;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多