2009-07-16 14 views
0

Ich habe drei Entitäten Benutzer, Firma und Adresse mit Erklärungen wie folgt:Probleme mit Besitz 12.59 Beziehungen und Eltern/Kind-Beziehungen

@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 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 abrufen und von diesem Objekt verweisen auf den Schöpfer. Anscheinend denkt JDO, dass die Adressen der beiden Unternehmen den 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 protected]) 

Der Schlüssel des Benutzers

User([email protected]) 

der Schlüssel von dem ist Unternehmen ist

User([email protected])\Company(1) 

und der Schlüssel der beiden Adressen sind

User([email protected])\Company(1)\Address(1) 
User([email protected])\Company(1)\Address(2) 

Ich bin ziemlich neu in hierarchischen Datenbanken, also habe ich mich gefragt, warum die beiden Adressen als Kinder von Benutzer statt Nachkommen von Benutzer und Kinder der Firma persistent/interpretiert werden. Was ist die richtige Hierarchie für eine Situation wie diese? Vielen Dank.

Antwort

0

Welche Version der App Engine SDK verwenden Sie? Am Montag haben sie eine neue Version veröffentlicht, die viele Korrekturen für JDO-Probleme enthält. (release notes) Vier oder fünf der Fixes haben mit Beziehungen zwischen Objekten zu tun, so ist es möglich, dass dieses Problem entweder gelöst oder auf eine neue Art und Weise gebrochen wurde :) OTOH, könnte Ihr Problem mit dieser offenen ticket in Verbindung stehen.

Ich bin ziemlich neu in hierarchischen Datenbanken, also habe ich mich gefragt, warum die beiden Adressen als Kinder von Benutzer statt Nachkommen von Benutzer und Kinder der Firma persistent/interpretiert werden.

Die Schlüsselhierarchie, die Sie sehen, basiert 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 protected]) 
Company(1)\Address(1) 
Company(1)\Address(2) 

Der Datenspeicher nicht notwendigerweise wissen um 12.59 Mappings, oder eine zu viele Abbildungen. Es lässt Sie einfach Schlüssel anderer Entitäten referenzieren, wie Sie möchten. Die JDO-Schicht fügt jedoch automatisch alle Entitäten in einer eigenen Beziehung in dieselbe Entitätsgruppe ein, vermutlich, um zu erzwingen, dass Änderungen transaktionsbedingt vorgenommen werden.

Mit all dem gesagt, sieht Ihre Struktur für mich OK. Es sieht so aus, als würde der JDO-Layer nur nach Abkömmlingen von Entitätsgruppen suchen, die der Kind-Adresse angehören, anstatt gezielt nach einem Untergeordneten zu suchen, der ein direktes Kind des Unternehmens ist.

+0

Das Herunterladen des neuen SDK (1.2.2) hat funktioniert. Ich habe vorher 1.2.1 benutzt, welches das Problem/Defekt hatte. Danke Peter. –