У меня проблемы с пониманием того, как группы сущностей и отношения работают с 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]
Себастьен