Связывание с созданием нового объекта с использованием 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")