Проблемы с собственными отношениями один-к-одному и родителями - PullRequest
0 голосов
/ 17 июля 2009

У меня есть три объекта: Пользователь, Компания и Адрес с такими объявлениями:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class User implements Serializable {
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key key;

  @Persistent(mappedBy="creator")
  @Order(extensions = @Extension(vendorName="datanucleus", key="list-ordering", value="title asc"))
  private Collection<Company> companies;

  @Persistent
  private Address address;
  . . . 
}

public class Company implements Serializable {
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key key;

  @Persistent
  @Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
  private Key creatorKey;

  @Persistent
  private User creator;

  @Persistent
  private Address address;
  . . .
}

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Address implements Serializable{
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key key;
  . . .
}

После создания пользователя я затем сохраняю две компании, принадлежащие пользователю, после задания их адресов и другой информации, например:

company.setCreatorKey(currentUser.getKey());
pm.makePersistent(company);

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

address is mapped as a 1 to 1 relationship but there is more than one enity of kind Address that is a child of User(email@email.com) 

Ключ пользователя

User(email@email.com)

ключ компании

User(email@email.com)\Company(1) 

и ключ двух адресов:

User(email@email.com)\Company(1)\Address(1) 
User(email@email.com)\Company(1)\Address(2)

Я довольно новичок в иерархических базах данных, поэтому мне было интересно, почему два адреса сохраняются / интерпретируются как дочерние элементы пользователя, а не как потомки пользователя и дочерние элементы компании. Какова правильная иерархия для такой ситуации? Спасибо.

1 Ответ

0 голосов
/ 17 июля 2009

Какую версию движка приложений SDK вы используете? В понедельник они выпустили новый, который включает в себя множество исправлений для проблем JDO. ( примечания к выпуску ) Четыре или пять исправлений связаны с отношениями между объектами, поэтому возможно, что эта проблема либо решена, либо сломана по-новому :) ОТО, ваша проблема может быть связана с этим открытым тикетом .

Я довольно плохо знаком с иерархическими базами данных, поэтому мне было интересно, почему два адреса сохраняются / интерпретируются как дочерние элементы пользователя, а не как потомки пользователя и дочерние элементы компании.

Иерархия ключей, которую вы видите, основана на группах сущностей. Что касается хранилища данных, то ваши компании могут быть в другой группе сущностей, отличной от пользователя, что приведет к такой ключевой структуре:

User(email@email.com)
Company(1)\Address(1) 
Company(1)\Address(2)

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

С учетом всего сказанного, ваша структура выглядит хорошо для меня. Похоже, что слой JDO просто проверяет всех потомков группы сущностей, имеющих Kind Address, а не ищет конкретно, кто является прямым потомком Company.

...