JDO в Google App Engine: как реализовать полиморфные отношения? - PullRequest
1 голос
/ 19 января 2011

Я работаю над приложениями на основе GAE, которые используют JDO для доступа к хранилищу данных.Мне нужно реализовать полиморфные отношения между постоянными объектами.

Есть абстрактный родительский класс:

@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class Parent {
 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")
 String id;

    // ....

И несколько дочерних классов:

@PersistenceCapable (identityType = IdentityType.APPLICATION)
public class Child extends Parent {

    // ....

Также есть еще один класс, который должен иметь ссылку на один из дочерних классов.В соответствии с разделом «Полиморфные отношения» статьи «1010 *« Отношения сущностей в JDO », лучший способ реализовать такие отношения - хранить ключ объекта, поэтому этот класс выглядит следующим образом:

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

    @Persistent
    private String reference;

    // ....

Я получаю строковый ключ ссылочного объекта из экземпляра OtherClass.Затем я хотел бы получить сам ссылочный объект: это экземпляр одного из родительских подклассов.НО:

Выдается исключение JDOObjectNotFoundException ( javax.jdo.JDOObjectNotFoundException: Нет такого объекта FailedObject: ... ).

Исключение FatalNucleusUserException выдается ( org.datanucleus.store.appengine.FatalNucleusUserException: получен запрос на поиск объекта типа Parent, но предоставленный идентификатор является строковым представлением ключа для типа Child )

Как правильно извлечь экземпляр одного из подклассов, на которые ссылается другая сущность?

ОБНОВЛЕНИЕ : Я нашел этот поток в группе Google GAE, но, честно говоряэто мне не очень помогло.

Ответы [ 3 ]

1 голос
/ 23 января 2011

Я обнаружил ту же проблему с JDO и App Engine, поэтому я запустил проект, который реализует обходной путь для этого.https://code.google.com/p/datanucleus-appengine-patch/ Мой первый тест с кодом, который у меня есть, теперь выглядит хорошо, не стесняйтесь попробовать его, чтобы дать мне обратную связь.

На самом деле мой обходной путь может решить вашу проблему двумя способами.

  1. Я реализовал getObjectById (class, id), который также ищет виды, которые являются экземплярами предоставленного класса.
  2. Я реализовал getObjectById (oid), который выполняет некоторую специальную обработку поиска, если oidтипа com.google.appengine.api.datastore.Key, тогда он определит правильный класс для возврата.
  3. Я добавил новую аннотацию @PolymorphicRelationship, с которой легко будет работать, чтобы обойти этот App Engineописывает, с хранением ключей.Пример показан ниже:
 @Persist
 public Collection<Key> myChildKeys;

 @NotPersistent
 @PolymorphicRelationship(keyField ="myChildKeys")
 public Collection<TestChild> myChildren;
1 голос
/ 23 августа 2011

Я использую этот довольно зловонный и вонючий антишаблон, чтобы обойти это ограничение JDO / App Engine.

@JsonIgnore
@Persistent(mappedBy="account")
private List<XProvider> xProviders;

@JsonIgnore
@Persistent(mappedBy="account")
private List<YProvider> yProviders;

// TODO: add extra providers here and in getProviders() below...

А потом получить коллекцию:

public List<XProvider> getXProviders() {
    if (xProviders == null) {
        xProviders = new ArrayList<XProvider>();
    }
    return xProviders;
}
//etc with other getters and setters for each collection.

public List<Provider> getProviders() {

    List<Provider> allProviders = new ArrayList<Provider>();

    // TODO: add extra providers here...
    allProviders.addAll(getXProviders());
    allProviders.addAll(getYProviders());

    return allProviders;
}

Это плохое решение, но любой порт в шторм ...

(также немного относится к этой ошибке, используя интерфейсы в качестве типа коллекции http://code.google.com/p/datanucleus-appengine/issues/detail?id=207)

0 голосов
/ 20 января 2011

Слой JDO App Engine в настоящее время не поддерживает полиморфизм.На самом деле, я не уверен, поддерживает ли JDO это вообще или нет.

...