Domanda

Ho tre entità utente, società e l'indirizzo con le dichiarazioni in questo modo:

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

Dopo aver creato un utente Ho poi insisto due società di proprietà di un utente dopo aver impostato i loro indirizzi e altre informazioni in questo modo:

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

Il problema sorge quando a recuperare una società e da quello oggetto di riferimento il creatore. A quanto pare JDO pensa che gli indirizzi delle due società appartengono all'utente in contrasto con le imprese e il seguente errore viene registrato:

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) 

La chiave del l'utente è

User(email@email.com)

la chiave della società è

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

e il tasto dei due indirizzi sono

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

Sono abbastanza nuovo alle basi di dati gerarchiche così mi chiedevo perché i due indirizzi vengono mantenute / interpretati come figli di utente invece di discendenti di utenti e figli di società. Qual è la gerarchia corretta per una situazione come questa? Grazie.

È stato utile?

Soluzione

Quale versione del SDK App Engine stai usando? Lunedi 'hanno pubblicato una nuova che include un sacco di correzioni per problemi di JDO. ( note di rilascio ) Quattro o cinque delle correzioni hanno a che fare con i rapporti tra oggetti, quindi è possibile questo problema è stato risolto sia, o rotto in modo nuovo :) OTOH, il problema potrebbe essere correlato a questo open biglietto .

  

Sono abbastanza nuovo alle basi di dati gerarchiche così mi chiedevo perché i due indirizzi vengono mantenute / interpretati come figli di utente invece di discendenti di utenti e bambini di società.

La gerarchia chiave che state vedendo è basata su entità Gruppi. Per quanto riguarda l'archivio dati è interessato si potrebbe avere la vostra società in un diverso gruppo di entità che l'Utente, con un conseguente struttura chiave come questo:

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

L'archivio dati non necessariamente conosce uno a uno mappature, o uno a molti mappature. E 'solo consente di fare riferimento le chiavi di altri soggetti come più vi piace. Tuttavia, lo strato di JDO mette automaticamente tutte le entità in un rapporto di proprietà nello stesso gruppo di entità, presumibilmente in modo che possa imporre che i cambiamenti avvengono in modo transazionale.

Con tutto ciò che viene detto, la struttura sembra OK per me. Sembra che lo strato di JDO è solo la verifica di eventuali discendenti di gruppo entità che sono di Kind Indirizzo, piuttosto che alla ricerca specificamente per uno che è un figlio diretto della società.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top