Самый дешевый способ получить / записать несколько объектов на GAE - PullRequest
1 голос
/ 15 февраля 2012

У меня есть этот конкретный случай, который вызывает у меня некоторые сомнения: у моего класса A есть отношение один-ко-многим с B:

A  1----->*  B

, что, насколько я знаю, делает принадлежащие им экземпляры принадлежащимив той же группе лиц.Мне нужно извлечь один конкретный экземпляр A и один из его B, поэтому я ищу A и перебираю его список B, чтобы найти конкретный B (всегда поиск по Id).После этого я изменяю один атрибут A и B и фиксирую свои изменения путем слияния A. Итак, вот мои вопросы:

  1. Зная, что я должен получить A и B (потому что я должен изменить оба)Должен ли я выполнить 2 поиска вместо итерации списка B?
  2. При 2 поисках изменения в B будут сохранены, если я сохраню только A?
  3. Будет ли вопрос 1 и 2 иметь одинаковый ответв этом случае:
A  1----->*  C  1----->*  B

Дополнение вопроса некоторым кодом:

@Entity
public class A
{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Key key;

    private int aField;

    @OneToMany(cascade={CascadeType.ALL})
    private List<B> bList;

    //...
}

@Entity
public class B
{
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Key key;

     private int someBField;

     // no way to get A from here...

     //...
}

public void someService1(Key aKey, Key bKey)
{
     //...

     // Here, I'm sure that bKey is of an entity son of aKey entity (I trust the client)
     A a = entityManager.find(A.class, aKey);
     a.setAField(a.getAField()++);

     for(B b : a.getBList())
          if(b.getKey().equals(bKey))
                b.setSomeBField(b.getSomeBField()++);

     entityManager.merge(a);

     //...
}

public void someService2(Key aKey, Key bKey)
{
     //...

     // Here, I'm sure that bKey is of an entity son of aKey entity (I trust the client)
     A a = entityManager.find(A.class, aKey);
     a.setAField(a.getAField()++);

     B b = entityManager.find(B.class, bKey);
     b.setSomeBField(b.getSomeBField()++);

     entityManager.merge(a);

     //...
}

Ну, и someService1, и someService2 делают одно и то же, если я все сделал правильно.Какой из них лучше?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Если я правильно понял, вам не нужно ничего перебирать, а вместо этого используйте filter() на любом Query, который вам нравится. Примеры (Python):

query.filter('height >', 42).filter('city = ', 'Seattle')

query.filter('user = ', users.get_current_user())

Если вы используете Java, вы будете использовать addFilter в своих запросах ( больше информации ).

1 голос
/ 16 февраля 2012

Если вы знаете идентификатор (и говорите, что ищете по идентификатору), тогда просто наберите em.find для A и em.find для B. Два вызова. К сожалению, API JPA не имеет em.findAll. JDO, с другой стороны, имеет pm.getObjectsById

...