2016-07-13 2 views
0

В приложении Google App Engine, у меня есть эта модель:Без учета свойств при сохраняющихся бесхозный объект отношение JDO (GAE)

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Message { 

    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private Date timestamp; 

    @Persistent 
    private String text; 

    @Unowned 
    @Persistent(defaultFetchGroup = "true") 
    private User sender; 

    ... 
} 

Модель имеет @Unowned отношение к отправителю, так как пользователь может существовать независимо от сообщение.

Что я хочу сделать, это сохранить объекты Message с частичными объектами User (например, я заинтересован в сохранении идентификатора пользователя и имени пользователя). Однако в моем классе конечных точек я сохраняю сообщения только в порядке, однако, если я не включаю все поля для данного пользователя в отношение, пользовательский объект обновляется с отсутствующими полями (например, у пользователя больше нет пароля и т. Д. .). Каков наилучший способ добиться того, чего я хочу, без «развращения» исходного объекта?

PS My endpoints метод мертв просто. В основном просто вызывается pm.makePersistent(message); на сообщение (заданное как параметр метода).

ответ

1

Вы используете @Unowned аннотацию, что означает, что только ссылка на фактическое User объекта будет храниться в переменной sender под Message класса.

Когда вы получаете доступ к переменной sender, Datastore выполнит запрос get для получения объекта User, связанного с сообщением.

Вы можете подтвердить это для себя, перейдя в Datastore приборной панели вашего проекта (https://console.cloud.google.com/datastore для производства и http://localhost:8080/_ah/admin для местного) и просматривают Message лиц.

Вы должны увидеть поле, в котором хранится User, которое называется user_id_OID со значением Key(User/XXXXX).

В качестве дополнительного примечания Google рекомендует отказаться от JDO/JPA до Objectify или API Datastore.

Предупреждения: Мы считаем, что большинство разработчиков будут иметь лучший опыт использования низкоуровневого API хранилища данных, или один из интерфейсов API с открытым исходным кодом, разработанным специально для Datastore, такие как объективизация. JDO был разработан для использования с традиционными реляционными базами данных и поэтому не имеет никакого отношения к , которые явно представляют некоторые аспекты Datastore, которые делают его отличным от реляционных баз данных, таких как группы сущностей, и запросы предков. Это может привести к тонким проблемам, которые трудно понять и исправить.

Смотрите здесь: https://cloud.google.com/appengine/docs/java/datastore/jdo/overview-dn2

+1

Спасибо! Хотя вы действительно не обращались к моему вопросу, я нашел интересное интересное. Я не знал, что Google не советовал использовать JDO. Я посмотрю на Objectify. –

+0

Я мог бы сказать это по-другому, но то, что я пытался сказать, заключается в том, что объект «Пользователь» в этом случае является отдельным объектом из «Послания». Вы должны создавать и поддерживать объект «Пользователь» отдельно от « Сообщение ". т. е. вам необходимо также сохранить пользователя отдельно. – COBB

+0

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

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