Pregunta

Tengo tres entidades del usuario, empresa y dirección de las declaraciones, así:

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

Después de crear un usuario a continuación, persisten dos empresas propiedad de un usuario después de configurar sus direcciones y otros datos de este modo:

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

El problema surge cuando recupero una empresa ya partir de ese objeto de referencia del creador. Al parecer JDO piensa que las direcciones de las dos empresas pertenecen al usuario a diferencia de las empresas y el siguiente error se registra:

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 clave del usuario es

User(email@email.com)

la clave de la empresa es

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

y la tecla de las dos direcciones son

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

Soy bastante nuevo en bases de datos jerárquicas así que me preguntaba por qué las dos direcciones se conservan / interpretadas como hijos de usuario en lugar de descendientes de usuario y niños de empresa. ¿Cuál es la jerarquía correcta para una situación como esta? Gracias.

¿Fue útil?

Solución

¿Qué versión del SDK de App Engine está usando? El lunes lanzaron una nueva que incluye un montón de correcciones para problemas JDO. ( notas de la versión ) Cuatro o cinco de las correcciones tienen que ver con las relaciones entre las objetos, por lo que es posible que este problema se ha resuelto bien, o se rompe de una manera nueva :) Otoh, el problema podría estar relacionado con este billete .

  

Soy bastante nuevo en bases de datos jerárquicas así que me preguntaba por qué las dos direcciones se conservan / interpretadas como hijos de usuario en lugar de descendientes de usuario y niños de empresa.

La jerarquía de claves que está viendo se basa en las Entidades Grupos. Como hasta el almacén de datos está en cuestión podría tener sus empresas en una entidad de su grupo diferente que el usuario, lo que resulta en una estructura clave de esta manera:

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

El almacén de datos no conoce necesariamente de una a una las asignaciones, o uno a muchos mapeos. Simplemente le permite referencia a las claves de otras entidades como usted quiera. Sin embargo, la capa de JDO pone automáticamente todas las entidades en una relación de propiedad en el mismo grupo de entidades, presumiblemente, por lo que puede hacer cumplir que los cambios ocurren de manera transaccional.

Con todo esto dicho, su estructura se ve bien para mí. Parece que la capa de JDO es sólo la comprobación de las descendientes del grupo de entidades que son de tipo de direcciones, en lugar de buscar específicamente para uno que es un hijo directo de la empresa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top