0

У меня есть вопрос, и я не нашел то, что хотел. Я использую google Endpoints с appengine и Objectify. У меня есть объект Round, которому нужен ключ созданной игры. Поэтому, когда мне нужно создать новую Игру, я создаю свою новую игру, и после этого я создаю раунд с новым ключом. Я использую функцию .now(), чтобы сохранить игру, но иногда игра не создается, и у меня есть Round, созданный без игры. Поскольку это было проблематично, я решил зациклиться, чтобы получить игру, пока она не будет создана, но я знаю, что это очень плохой способ сделать это, и мне интересно, что я могу использовать вместо этого.Objectify: Использовать ключ сущности juste created

До:

//Create a new game 
Game game = new Game(pending_game.getPlayer(),pending_game.getApplicant()); 
ofy().save().entity(game).now(); 

//Get the player just created 
game = ofy().load().type(Game.class).filter("player1 =", pending_game.getPlayer()).filter("player2 =", pending_game.getApplicant()).first().now(); 
Key<Game> key_game = Key.create(Game.class, game.getId());   
//We add the new round 
Round round = new Round(key_game,generateWord()); 
ofy().save().entity(round).now(); 

Сейчас:

//Create a new game 
Game game = new Game(pending_game.getPlayer(),pending_game.getApplicant()); 
ofy().save().entity(game).now(); 

Key<Game> key_game = null; 
//Get the player just created 
for(int i=0; i<5 && key_game == null;i++) 
{ 
    //Get the key of the new game created 
    game = ofy().load().type(Game.class).filter("player1 =", pending_game.getPlayer()).filter("player2 =", pending_game.getApplicant()).first().now(); 
    key_game = Key.create(Game.class, game.getId()); 
}     
//We add the new round 
Round round = new Round(key_game,generateWord()); 
ofy().save().entity(round).now(); 

Спасибо за вашу помощь.

+0

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

ответ

1

Зачем загружать сохраненные game?

Game game = new Game(pending_game.getPlayer(),pending_game.getApplicant()); 
ofy().save().entity(game).now();  
Key<Game> key_game = Key.create(Game.class, game.getId());   
//We add the new round 
Round round = new Round(key_game,generateWord()); 
ofy().save().entity(round).now(); 

Если ваше намерение было убедиться, что сохранение игры был успешным, прежде чем двигаться дальше, use a transaction:

Либо все операции в транзакции применяются, или ни один из них не применяются.

Objectify transaction docs с примерами.

+0

Я думал использовать транзакцию, но проблема в том, что я не могу использовать параметры из своей функции, если нет финалов. Что я могу сделать ? Объявить окончательную копию каждого из этих параметров? –

+1

Нет необходимости создавать копию. Просто добавьте ключевое слово 'final' к параметрам при объявлении метода. Например, 'public Article setArticleTags (@Named (" url ") final String url)' – willlma

+0

Спасибо за вашу помощь, он отлично работает. Еще одна вещь. Я должен зарегистрировать игрока с псевдою, и я хочу, чтобы псевдо было уникальным. Поэтому, когда я хочу добавить игрока, я проверяю, не было ли еще псевдо. Но если 2 человека берут одно и то же псевдо почти в то же время, он работает. Вы знаете, как я могу избежать этого? –

Смежные вопросы