Не мог сохранить объекты в GAE JDO

Я абсолютно нов и к JDO и к GAE, и изо всех сил пытался заставить свой слой данных сохранять любой код вообще!

Проблемы, с которыми я сталкиваюсь, могут быть очень простыми, но я просто наклоняюсь, кажется, находят любого способом, каким решением я пробую.

Во-первых проблема: (Немного упрощенный, но все еще содержит всю необходимую информацию), Моя модель данных как такова:

User:
    (primary key)
    String emailID
    String firstName

Car:
    (primary key)
    User user
    (primary key)
    String registration
    String model

Это было начальной моделью данных. Я реализовал объект CarPK получить составной первичный ключ Пользователя и регистрации. Однако это столкнулось со множеством проблем. (Который я сохраню в течение другого времени/вопроса),

Я затем изменил дизайн как таковой: Пользователь: (Неизменный)

Car:
(primary key)
String fauxPK (here fauxPK = user.getEmailID() + SEP + registration)
User user
String registration
String model

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

"Cannot have a java.lang.String primary key and be a child object"

Found the following helpful link about it:
http://stackoverflow.com/questions/2063467/persist-list-of-objects

Перешел к ссылке, предложенной туда, который объясняет, как создать Ключи, однако они продолжают говорить о "Группах Объекта" и "Родителях Entity Group". Но я, может казаться, не нахожу статей или сайтов, которые объясняют, что является "Entity Group" s или "Entity Group Родители"

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

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

И благодарит читать такое длинное сообщение :)

5
задан Basil Dsouza 3 May 2010 в 17:11
поделиться

2 ответа

Боюсь, вам не понравится ответ. GAE JDO должен использоваться очень специфическим образом и чреват ограничениями, которые вы должны соблюдать, чтобы использовать его эффективно. Читайте документы вперед и назад. Что касается проблемы, с которой вы сталкиваетесь сейчас, вам, вероятно, придется прочитать этот раздел несколько раз:

http://code.google.com/appengine/docs/java/datastore/relationships.html

GAE JDO имеет принадлежащие и неимущие отношения. См. Документацию выше для примеров принадлежащих и не имеющих владельца . Я полагаю, вы хотите, чтобы Автомобиль и Пользователь имели отношения без владельца . Обратите внимание на это откровение в документации Google App Engine о взаимоотношениях без собственности:

http://code.google.com/appengine/docs/java/datastore/relationships.html#Unowned_Relationships

Помимо отношений собственности, JDO API также предоставляет средство для управления отношениями без владельца. Реализация JDO в App Engine еще не реализует эту возможность , но не беспокойтесь, вы по-прежнему можете управлять этими отношениями, используя значения ключей вместо экземпляров (или коллекций экземпляров) вашей модели. объекты.

По сути, это означает, что для использования GAE JDO вы не должны использовать прямую ссылку для отношения без владельца , как между классами Car и User. Скорее, вы должны использовать косвенные ссылки между ними, то есть в автомобиле должно быть поле для ключа пользователя, а не прямая ссылка на самого пользователя.Некоторые из ваших проблем связаны с тем, что GAE JDO не может справиться с тем, как вы моделируете эти отношения в коде.

Аскер продолжает:

Перешел по предложенной там ссылке, которая объясняет, как создавать ключи, однако они продолжают говорить о «Группах сущностей» и «Родителях групп сущностей». Но я не могу найти никаких статей или сайтов, объясняющих, что такое «Entity Group» или «Entity Group Parents»

Entity Group - граф объектов, которые изначально сохранялись вместе . Например, поскольку автомобиль ссылается непосредственно на пользователя, когда вы сохраняете данный экземпляр автомобиля в первый раз, вы также сохраняете экземпляр пользователя, на который он ссылается, и этот экземпляр автомобиля и этот экземпляр пользователя будут частью одной и той же сущности. группа. Если этот экземпляр пользователя уже был сохранен либо отдельно сам по себе, либо как часть другого экземпляра автомобиля, то этот экземпляр пользователя уже находится в другой группе сущностей. «Собственные» отношения должны находиться в одной группе сущностей. Обратите внимание, что транзакции GAE JDO могут изменять только 1 группу сущностей - больше вызовет исключение.

Родительская группа сущностей - постоянный класс верхнего уровня / корневой («родительский») . В приведенном выше примере, когда вы впервые сохраняете данный экземпляр Car, вы также сохраняете экземпляр User, на который он ссылается. Экземпляр Car является родительской группой сущностей. «Принадлежащий» «дочерний» класс, такой как User, встраивает ключ своего родителя (Car) в свой собственный (User) ключ.Если вы должны были извлечь экземпляр Car из базы данных, а затем попытаться получить доступ к пользователю, на которого ссылается этот автомобиль, тогда GAE JDO будет использовать ключ автомобиля для поиска соответствующего пользователя (поскольку в ключ целевого пользователя встроен ключ родительского автомобиля. как часть собственного ключа).

Спрашивающий получил это сообщение об ошибке:

«Не может иметь первичный ключ java.lang.String и быть дочерним объектом»

Обратите внимание на этот оператор в документации :

Дочерний Класс должен иметь ключевое поле, тип которого может содержать информацию о родительском ключе: либо ключ, либо значение ключа, закодированное в виде строки. См. Создание данных: ключи для получения информации о типах ключевых полей.

Это означает, что «дочерние» классы должны использовать определенные типы ключей (т.е. ключи, которые способны инкапсулировать свой родительский ключ в дочерний ключ). Длинные и Строка подходят для классов родительской группы сущностей , то есть недочерних классов. Однако «дочерние» классы должны использовать для своего ключа тип Key или Key, закодированный как String . Сообщение об ошибке указывает, что класс Car относится к классу User, как если бы он был «принадлежащим» «дочерним» классом, и поэтому класс User должен использовать тип ключа, подходящий для дочернего элемента, но класс User не использует ключ тип, подходящий для дочернего элемента (незакодированная строка).

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

Если это хоть какое-то утешение,Я сам сталкиваюсь с такими же проблемами с GAE JDO (у меня даже есть класс Car!).

13
ответ дан 18 December 2019 в 14:43
поделиться
0
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: