Проблемы с отношениями "один на один" и отношениями "родитель / потомок"

StackOverflow https://stackoverflow.com/questions/1140578

  •  16-09-2019
  •  | 
  •  

Вопрос

У меня есть три объекта User, Company и Address с такими объявлениями:

@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)

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

Это было полезно?

Решение

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top