Хранилище данных Google App Engine - как сохранить отношения один-к-одному - PullRequest
0 голосов
/ 05 июля 2011

У меня проблемы с пониманием того, как группы сущностей и отношения работают с GAE с использованием JDO.

Сценарий, который я запускаю, в основном:

PersistenceManager pm = this.pmf.get();

Player player = new Player();
player.setRanking(new Ranking());
Player persistent = pm.makePersistent(player);
// Here the detached copy is returned, and contains 
// all the persistent fields (including the Ranking)
Player detached = pm.detachCopy(persistent);

// In the real code, a lot of processing goes here and manipulates 
// The detached copy 
// The outcome is basically an updating ranking. What I want to do is 
// to assign this new ranking to the player, and persist 
// it in the datastore
detached.setRanking(new Ranking());

// An exception is thrown here
pm.makePersistent(detached );

Вывод вышеуказанного кода является исключением:

Detected attempt to establish Player(10) as the parent of Ranking(12) but the entity identified by Ranking(12) has already been persisted without a parent. A parent cannot be established or changed once an object has been persisted.

Что я понимаю из этого, так это то, что сущность ранжирования сначала сохраняется (без родителя, т.е. как корневая сущность), а затем игрок сохраняется как родительский объект первой сущности ранжирования. Поскольку родитель не может быть изменен, это приводит к исключению.

Однако я бы хотел, чтобы приложение работало с отделенной копией и управляло ею по своему усмотрению, а также правильно создавало сущности при сохранении сущности Player в хранилище данных.

Мои занятия помечены следующим образом:

Player.java

@PersistenceCapable(detachable = "true")
@Inheritance(customStrategy = "complete-table")
public class Player implements Serializable, IPlayer {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
    private String id;

    @Persistent(defaultFetchGroup="true", dependent="true")
    private Ranking ranking;
}

And Ranking.java

@PersistenceCapable(detachable = "true")
@Inheritance(customStrategy = "complete-table")
public class Ranking implements Serializable {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
    private String id;

    // If I could I'd rather get rid of this reference to the parent
    @Persistent(mappedBy = "ranking", defaultFetchGroup="true")
    private Player player;
}

В парадигме сущности / группы сущностей есть нечто, чего я, очевидно, не понимаю, и был бы рад получить любую подсказку, которую вы можете предложить по этому поводу.

[EDIT]
Я собрал контрольный пример , чтобы воспроизвести проблему.
[/ EDIT]

Себастьен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...