2010-05-03 13 views
5

¡Estoy completamente fresco tanto para JDO como para GAE, y he estado luchando para que mi capa de datos persista en cualquier código!No se pueden persistir objetos en GAE JDO

Los problemas a los que me enfrento pueden ser muy simples, pero parece que no puedo encontrar ninguno, sin importar qué solución intente.

primer lugar el problema: (ligeramente simplificada, pero todavía contiene toda la información necesaria) Mi modelo de datos es como tal:

User: 
    (primary key) 
    String emailID 
    String firstName 

Car: 
    (primary key) 
    User user 
    (primary key) 
    String registration 
    String model 

Este fue el modelo de datos inicial. Implementé un objeto CarPK para obtener una clave primaria compuesta del usuario y el registro. Sin embargo, eso se encontró con una variedad de problemas. (Que voy a guardar para otro momento/pregunta)

luego cambié el diseño como tal: usuario: (Sin cambios)

Car: 
(primary key) 
String fauxPK (here fauxPK = user.getEmailID() + SEP + registration) 
User user 
String registration 
String model 

Esto funciona muy bien para el usuario, y se puede insertar y recuperar usuario objetos. Sin embargo cuando intento insertar un objeto de coches, me sale el siguiente error:

"Cannot have a java.lang.String primary key and be a child object" 

Found the following helpful link about it: 
http://stackoverflow.com/questions/2063467/persist-list-of-objects 

Fuimos al enlace sugirió allí, que explica cómo crear claves, sin embargo, sigue hablando de "grupos de entidades" y "Grupo Entidad Padres ". Pero no puedo encontrar ningún artículo o sitio que explique qué son "Entity Group" o "Entity Group Parents"

Podría tratar de juguetear un poco más para descubrir si puedo almacenar un objeto de alguna manera, pero estoy corriendo por la paciencia y también preferiría comprenderlo e implementarlo que viceversa.

Así que apreciaría cualquier documento (incluso si es enorme) que cubre todos estos puntos, y preferiblemente tiene algunos ejemplos que van más allá del modelado de datos muy básico.

Y gracias por la lectura de un largo post tales :)

+1

Por favor, incluye tu código. – Finbarr

Respuesta

13

me temo que no va a gustar la respuesta. GAE JDO tiene que ser utilizado de una manera muy específica y está lleno de limitaciones que debe observar para usarlo de manera efectiva. Lea los documentos hacia adelante y hacia atrás. Para el tema que está viendo ahora, es probable que tenga que leer esta sección un par de veces:

http://code.google.com/appengine/docs/java/datastore/relationships.html

GAE JDO tiene propiedad y sin dueño relaciones. Consulte la documentación anterior para ver ejemplos de propiedad de frente a sin propietario. Creo que quiere Car y User para tener una relación sin propietario. Tenga en cuenta que esta revelación en la documentación de Google App Engine acerca de las relaciones sin dueño:

http://code.google.com/appengine/docs/java/datastore/relationships.html#Unowned_Relationships

In addition to owned relationships, the JDO API also provides a facility for managing unowned relationships. The App Engine implementation of JDO does not yet implement this facility, but don't worry, you can still manage these relationships using Key values in place of instances (or Collections of instances) of your model objects.

Esto significa, esencialmente, a utilizar GAE JDO, no se debe utilizar una referencia directa para un relación sin dueño como entre el Clases de coche y usuario.En su lugar, debe usar referencias indirectas entre ellos, es decir, el automóvil debe tener un campo para la clave del usuario en lugar de una referencia directa al mismo usuario. Algunos de los problemas que está teniendo es porque GAE JDO no puede lidiar con la forma en que está modelando esta relación en el código.

autor de la pregunta pasa a decir:

Went to the link suggested there, that explains how to create Keys, however they keep talking about "Entity Groups" and "Entity Group Parents". But I cant seem to find any articles or sites that explain what are "Entity Group"s or an "Entity Group Parents"

Entidad Grupo-a graph of objects that were initially persisted together. Por ejemplo, dado que Car se refiere directamente a un Usuario, cuando persiste una instancia de Car dada por primera vez, entonces también persistiría la instancia de Usuario a la que se refiere y esta instancia de Car y esta instancia de Usuario serían parte de la misma entidad grupo. Si esta instancia de usuario ya se ha conservado, independientemente o como parte de otra instancia de Car, esta instancia de usuario ya está en otro grupo de entidades. Se supone que las relaciones "de propiedad" están en el mismo grupo de entidades. Tenga en cuenta que las transacciones GAE JDO solo pueden modificar 1 grupo de entidades; cualquier más generará una excepción.

Entity Group Parent - a top-level/root ("parent") persisted clas s. En el ejemplo anterior, cuando persiste una instancia de Car dada por primera vez, también persistiría en la instancia de Usuario a la que hace referencia. La instancia de Car es el padre del grupo de entidades. Una clase "propia" de "niño" como Usuario incorpora la clave de su padre (Car) dentro de su propia clave (Usuario). Si sacara una instancia de Car de la base de datos y luego intentara acceder al Usuario al que hace referencia este Coche, GAE JDO usará la clave del Coche para encontrar el Usuario correspondiente (porque la clave del Usuario objetivo tiene la clave del Coche principal incrustada) como parte de su propia clave).

Asker consiguió este mensaje de error:

"Cannot have a java.lang.String primary key and be a child object"

Nota this statement in the docs:

The child class must have a key field whose type can contain the parent key information: either a Key, or a Key value encoded as a string. See Creating Data: Keys for information on key field types.

Esto significa que las clases de los "niños" deben utilizar certain types of keys (es decir, las teclas que son capaces de encapsular clave de sus padres dentro de la clave del niño). Long y String son adecuados para clases de grupos de padres clases, es decir, clases no infantiles. Sin embargo, las clases "secundarias" deben usar el tipo Key o Key encoded as String para su clave. El mensaje de error indica que la clase Auto se refiere a la clase Usuario como si fuera una clase "hija" "propiedad" y, por lo tanto, la clase Usuario debe usar un tipo de clave apropiado para un niño, pero la clase Usuario no está utilizando una clave escriba apropiado para un niño (Cadena no codificada).

La solución para el problema inmediato es modelar el coche y el usuario como una relación sin propietario al cambiar el coche de tener la referencia directa al usuario para tener una referencia indirecta almacenando la clave del usuario relacionada. La solución general probablemente incluya una mirada profunda sobre cómo adaptar su modelo de objetos al marco GAE JDO (una vez que pase por los documentos para tratar de entenderlo). Esto probablemente incluirá tener que administrar manualmente algunas de las relaciones entre las clases.

Si me sirve de consuelo, estoy lidiando con el mismo tipo de problemas con GAE JDO (incluso tengo una clase de auto también).

+0

En primer lugar ¡Gracias por tomarse el tiempo para brindar una respuesta tan detallada! Muy apreciado ... Al principio había intentado modelar las relaciones de propiedad, pero eso no funcionaba debido a varios problemas con la clave.Como me estoy quedando sin tiempo, y este proyecto no va a ser demasiado sobre el modelo DB, he decidido ir con las referencias indirectas. Regresaré a la experimentación para mi próximo proyecto. –

+0

@ Basil: creo que querías una relación "sin dueño", pero codificaste una relación de "propietario" (mediante el uso de referencias directas). Como se indica en esta respuesta, el uso de referencias indirectas es la solución válida, no es necesario "experimentar" más. –

+0

En realidad, desde el principio yo quería una relación de propiedad. Incluso había creado los objetos PK para representar el registro de usuario y automóvil como clave. Sin embargo, eso no funcionó, con problemas aún más confusos. Por ahora, la solución es aceptable, pero aún estaba interesado en aprender la forma correcta de hacerlo. Porque la solución actual trata a Big Table como un RDBMS. –

Cuestiones relacionadas