Frage

Ich habe drei Entitäten Benutzer, Firma und Adresse mit Erklärungen wie folgt:

@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;
  . . .
}

Nach dem Erstellen eines Benutzers ich bestehen dann zwei von einem Benutzer gehören Unternehmen nach ihren Adressen und andere Informationen wie so einstellen:

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

Das Problem entsteht, wenn ich ein Unternehmen und von diesem Objekt abrufen verweisen auf den Schöpfer. Anscheinend denkt JDO, dass die Adressen der beiden Unternehmen dem Nutzer gehören zu den Unternehmen gegenüber und der folgende Fehler protokolliert:

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) 

Der Schlüssel des Benutzers ist

User(email@email.com)

der Schlüssel des Unternehmens ist

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

und der Schlüssel der beiden Adressen sind

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

Ich bin ziemlich neu in hierarchischen Datenbanken so dass ich mich gefragt, warum die beiden Adressen werden als Kinder Benutzer statt Nachkomme von Benutzer- und Kindern von Unternehmen beharrt / interpretiert. Was ist die richtige Hierarchie für eine Situation? Danke.

War es hilfreich?

Lösung

Welche Version der App Engine SDK verwenden Sie? Am Montag veröffentlichten sie eine neue, die viele Fehlerbehebungen für JDO Fragen enthält. ( Release Notes ) Vier oder fünf des Updates hat mit Beziehungen zu tun, zwischen Objekte, ist es möglich, so dass dieses Problem entweder gelöst wurde, oder in einer neuen Art und Weise gebrochen :) OTOH, Ihr Problem könnte auf diese offene Ticket .

  

Ich bin ziemlich neu in hierarchischen Datenbanken so ich frage mich, warum die beiden Adressen werden als Kinder Benutzer statt Nachkomme von Benutzer- und Kindern von Unternehmen beharrt / interpretiert.

Die Schlüsselhierarchie Sie wird sehen, basierend auf Entitätsgruppen. Wie soweit der Datenspeicher betroffen ist Sie Ihre Unternehmen in einem anderen Entity-Gruppe als der Benutzer haben könnte, in einer Schlüsselstruktur wie folgt resultierende:

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

Der Datenspeicher weiß nicht unbedingt um 00.59 Zuordnungen oder eine zu viele Abbildungen. Es können nur Sie Schlüssel anderer Unternehmen verweisen, wie Sie wollen. Allerdings schlägt die JDO Schicht automatisch alle Instanzen in einer Besitz Beziehung in derselben Einheit Gruppe, vermutlich so kann es erzwingen, dass Änderungen in einer transaktionalen Weise geschehen.

Mit allem, was gesagt wird, Ihre Struktur sieht für mich OK. Es sieht aus wie die JDO Schicht nur für irgendwelche Entitätsgruppe Nachkomme Überprüfung, die von Art Adresse, anstatt speziell auf der Suche nach einem, die ein direktes Kind von Unternehmen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top