Pergunta

Eu tenho três entidades do usuário, empresa e endereço com declarações como assim:

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

Depois de criar um usuário Eu, então, persistem duas empresas pertencentes a um usuário depois de definir seus endereços e outras informações assim:

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

O problema surge quando eu recuperar uma empresa ea partir desse referência de objeto o criador. Aparentemente JDO pensa que os endereços das duas empresas pertencem ao usuário, ao contrário das empresas e o seguinte erro é registrado:

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) 

A chave do usuário é

User(email@email.com)

a chave da empresa é

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

e a chave dos dois endereços são

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

Eu sou muito novo para bancos de dados hierárquicos então eu queria saber por que os dois endereços são persistentes / interpretado como filhos de usuário em vez de descendentes de usuário e crianças de empresa. O que é a hierarquia correta para uma situação como esta? Obrigado.

Foi útil?

Solução

Qual versão do SDK do Google App Engine você está usando? Na segunda-feira eles lançaram um novo que inclui lotes de correções para problemas JDO. (Notas libertação ) Quatro ou cinco das correções têm a ver com as relações entre objetos, então é possível que esta questão foi tanto resolvido, ou quebrado de uma nova maneira :) OTOH, o problema pode estar relacionado a esta aberta bilhete .

Eu sou muito novo para bancos de dados hierárquicos então eu queria saber por que os dois endereços são persistentes / interpretado como filhos de usuário em vez de descendentes de usuário e crianças de empresa.

A hierarquia chave que você está vendo é baseado em grupos de entidades. Como tanto quanto o armazenamento de dados está em causa você poderia ter suas empresas em um diferente grupo de entidades que o usuário, resultando em uma estrutura-chave como este:

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

O armazenamento de dados não necessariamente saber sobre um a um os mapeamentos, ou um para muitos mapeamentos. Ele apenas permite referenciar chaves de outras entidades como quiser. No entanto, a camada de JDO coloca automaticamente todas as entidades em um relacionamento pertencente ao mesmo grupo de entidades, presumivelmente para que ele possa impor que as mudanças acontecem de forma transacional.

Com tudo o que está sendo dito, a sua estrutura parece OK para mim. Parece que a camada JDO é apenas a verificação de quaisquer descendentes grupo de entidades que são de tipo Address, em vez de olhar especificamente para aquele que é um filho direto da empresa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top