Связывание с созданием нового объекта с использованием GAE и JDO

Я создаю веб-сервис, используя Google App Engine и хранилище данных JDO.
Все работает хорошо, и у меня есть довольно хорошее понимание того, как части сочетаются друг с другом.

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

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

Я пытался добавить @Unique(name = "STORE_COMPOSITE_IDX", members = {"key", "name"}) классу магазина, думая, что если имя уже присутствует, оно будет ссылаться на этот магазин, но это не работает.

Как мне заставить это работать?

1 ответ

Если вы создаете новый объект, он не имеет идентичности, поэтому находится в состоянии "ПЕРЕХОДНЫЙ". Если вы передадите это механизму персистентности, он сохранит его как новый (либо как аргумент makePersistent, либо как поле объекта, переданного в makePersistent).

Если вы хотите связать существующий объект, вы должны извлечь существующий объект (pm.getObjectById), с которым вы хотите связать его, и установить для него поле вашего нового объекта. В этом случае найденный объект будет находиться в состоянии PERSISTENT или HOLLOW. Когда вы сохраните свой другой объект, он найдет существующий объект, поэтому просто свяжитесь с ним в БД.

Читайте о состоянии жизненного цикла объекта. Все в спецификации JDO или любых приличных документах JDO (и документы GAE НЕ "приличные документы JDO")

Другие вопросы по тегам