Объективировать много к одному с помощью Parent и RequestFactory - PullRequest
0 голосов
/ 31 марта 2012

У меня есть ситуация - в моем классе EquipmentType у меня есть список проверок оборудования

List<Key<EquipmentCheckout>> field

после прочтения ответа на этот вопрос: Объективизировать отношения: один ко многим, могу ли я сделать это эффективно? - кажется, что более эффективный способ сделать это - создать класс с именем EquipmentCheckouts который будет выглядеть примерно так:

class EquipmentCheckouts
  @Id 
  Long id

  @Parent 
  EquipmentType equipmentType

  @Indexed
  List<EquipmentCheckout> equipmentCheckouts

сейчас - вот что мне интересно - я использую RequestFactory и считаю, что RequestFactory должен иметь метод find (Long id). Из того, что я понимаю, чтобы извлечь объект EquipmentCheckouts с родителем EquipmentType, вам нужно будет сделать что-то вроде следующего:

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

Итак, если вы не можете использовать EquipmentType в методе find (Long id), как вы должны это сделать?

Для всего остального в моей системе у меня есть родительский бизнес, который хранится в сеансе зарегистрированных пользователей, поэтому, когда я иду, чтобы получить все, я аутентифицирую пользователя, а затем набираю ключ в бизнесе, чтобы найти, что это такое. Мне кажется, что что-то, что я не понимаю, правильно использует @Parent в Objectify.

Ответы [ 3 ]

2 голосов
/ 02 апреля 2012

Вам необходимо реализовать свой собственный Locator , который бы поддерживал сущности с родителем. Как вы правильно заметили, вы не можете просто использовать длинный идентификатор, потому что у него нет ключа родителя. Я решил эту проблему, реализовав Locator, который использует составной строковый ключ, который содержит полный путь к объекту.

Здесь важно то, что составной ключ используется только для RPC. Ваши сущности по-прежнему используют длинный идентификатор и не нуждаются в изменении.

Вот фрагмент кода:

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;
    }
}

Вы можете увидеть полную версию моего локатора здесь .

0 голосов
/ 09 октября 2013

Руслан ответ точный.Это решает проблему для сущностей с родителями и по-прежнему работает для корневых сущностей.

Я копирую здесь обновленную версию кода локатора, используя 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;
  }
0 голосов
/ 31 марта 2012

Не должно быть только Long в Интерфейс RequestFactory . Как говорят документы:

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). Один для родителя, а другой - для энтити.

...