Question

J'ai trois entités utilisateur, Société et adresse avec des déclarations comme ceci:

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

Après avoir créé un utilisateur alors je persiste deux sociétés détenues par un utilisateur après avoir réglé leurs adresses et d'autres informations comme ceci:

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

Le problème se pose lorsque je récupère une entreprise et de cet objet font référence au créateur. Apparemment JDO pense que les adresses des deux sociétés appartiennent à l'utilisateur, par opposition aux entreprises et l'erreur suivante est enregistrée:

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 clé de l'utilisateur est

User(email@email.com)

la clé de la société est

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

et la clé des deux adresses sont

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

Je suis assez nouveau pour les bases de données hiérarchiques, donc je me demandais pourquoi les deux adresses sont conservées / interprétées comme des enfants de l'utilisateur au lieu des descendants d'utilisateurs et les enfants de la société. Quelle est la hiérarchie correcte pour une telle situation? Merci.

Était-ce utile?

La solution

Quelle est la version du moteur d'application sdk utilisez-vous? Lundi, ils ont sorti un nouveau qui comprend beaucoup de solutions aux problèmes JDO. ( notes de publication ) Quatre ou cinq des correctifs ont à voir avec les relations entre objets, donc il est possible que ce problème a été résolu soit, ou cassé une nouvelle façon :) OTOH, votre problème pourrait être lié à cette ouverture billet .

  

Je suis assez nouveau pour les bases de données hiérarchiques, donc je me demandais pourquoi les deux adresses sont conservées / interprétées comme des enfants de l'utilisateur au lieu des descendants d'utilisateurs et les enfants de la société.

La hiérarchie des clés que vous voyez est basée sur les groupes d'entités. Comme pour autant que le datastore est concerné, vous pourriez avoir vos entreprises dans un autre groupe que l'entité l'utilisateur, ce qui dans une structure clé comme ceci:

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

Le datastore ne sait pas nécessairement un à un, les correspondances ou un à plusieurs applications. Il vous permet simplement de référencer les clés d'autres entités comme bon vous semble. Cependant, la couche JDO met automatiquement toutes les entités dans une relation appartenant au même groupe d'entités, sans doute pour qu'il puisse appliquer que les changements se produisent de manière transactionnelle.

Avec tout cela étant dit, la structure semble OK pour moi. On dirait que la couche JDO est en train de vérifier pour tous les descendants de groupe d'entités qui sont d'adresse Kind, plutôt que de chercher spécifiquement pour celui qui est un enfant direct de la société.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top