У меня есть три объекта: Пользователь, Компания и Адрес с такими объявлениями:
@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)
Я довольно новичок в иерархических базах данных, поэтому мне было интересно, почему два адреса сохраняются / интерпретируются как дочерние элементы пользователя, а не как потомки пользователя и дочерние элементы компании. Какова правильная иерархия для такой ситуации? Спасибо.