Вызов метода makePersistent()
не записывает данные в хранилище данных;закрытие PersistenceManager или фиксация изменений.Поскольку вы не сделали этого при выполнении запроса, вы получаете все объекты из хранилища данных, которое пока не включает объект, который вы только что вызвали makePersistent.
Прочитайте о состояниях объекта здесь: http://db.apache.org/jdo/state_transition.html
Есть два способа обойти это, вы можете поместить это в транзакцию, так как коммит записывает в хранилище данных (имейте в виду, что GAE 5 транзакция / ограничение типа сущности для транзакций) и фиксирует перед выполнением запроса;Пример использования транзакции ...
public Collection<MyObject> add(MyObject o) {
PersistenceManager pm = PMF.get().getPersistenceManager();
ArrayList<MyObject> list = null;
try {
Transaction tx=pm.currentTransaction();
try {
tx.begin();
pm.makePersistent(o);
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
}
Query query = pm.newQuery(MyObject.class);
List<MyObject> rs = (List<MyObject>) query.execute();
ArrayList<MyObject> list = new ArrayList<MyObject>();
for (MyObject r : rs) {
list.add(r);
}
} finally {
pm.close();
}
return list;
}
или вы можете закрыть диспетчер постоянства после вызова makePersistent для o, а затем открыть еще один, чтобы выполнить запрос.
// Note that this only works assuming the makePersistent call is successful
public Collection<MyObject> add(MyObject o) {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.makePersistent(o);
} finally {
pm.close();
}
pm = PMF.get().getPersistenceManager();
ArrayList<MyObject> list = null;
try {
Query query = pm.newQuery(MyObject.class);
List<MyObject> rs = (List<MyObject>) query.execute();
list= new ArrayList<MyObject>();
for (MyObject r : rs) {
list.add(r);
}
} finally {
pm.close();
}
return list;
}
ПРИМЕЧАНИЕ: Я изначально говорил, что вы можете просто добавить o
в список результатов перед возвратом;но это не очень разумно, поскольку в случае возникновения проблемы с записью o
в хранилище данных;тогда возвращенный список не будет отражать фактические данные в хранилище данных.Выполнение того, что у меня сейчас (совершение транзакции или закрытие вечера, а затем получение другой), должно работать, поскольку для вашего datastoreReadPolicy установлено значение STRONG.