Pregunta

I pregunta hecha antes de preguntar si es posible guardar una composición de clases compleja en Google Datastore dentro de Google AppEngine con Java, pero no fui lo suficientemente claro y perezoso para publicar toda mi clase, pero después de muchas horas de lucha comencé a rendirme.Aquí hay una pregunta más detallada con el código.

Sé que este tipo de cosas deberían funcionar bien, pero por alguna razón que desconozco, no funciona.El problema es que cuando guardo mi objeto, cierro la conexión de base de datos y luego la abro nuevamente, los datos están en blanco en ese objeto.El objeto está en la base de datos, puedo verlo cuando selecciono el ID de ese objeto, pero todo lo demás está en blanco.Lamentablemente, Google no tiene un visor de bases de datos para ver qué hay en esa base de datos.Intenté buscar y preguntar por un lado pero no tuve suerte.(hay uno pero es no funciona en mi computadora) Así que, aquí vamos:

Contenido

// imports...
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Content{

 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
 private String id;

 @Persistent protected String title;
 @Persistent protected String thumbnailURL;
 @Persistent protected List<Rating> ratings;
 @Persistent protected List<Tag> tags;
 @Persistent protected Double price;
 @Persistent protected User owner;

 // constructor and getters+setters
}

Curso

// imports...
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Course extends Content{

 @Persistent private Video video;
 @Persistent private Document document;
 @Persistent private String notes;
 @Persistent private String summary;

// constructor and getters+setters
    public String toString(){
  return "ID: " + this.getId() + " Title: "+this.getTitle()+", Price: "+this.getPrice()+", No. of Tags: "+this.getTags().size();
 }

}

Video

// imports...
public class Video extends Content {
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
  String id;

  @Persistent String fileUrl;

  // constructor and getters+setters
}

Documento

// imports...
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Document extends Content /*AthenaObject*/ {
 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
 private String id;

 @Persistent private String docUrl;

 // constructor and getters+setters
}

Etiqueta

// imports...
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Tag{
 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true")
 private String id;

 @Persistent private String tagText;

 // constructor and getters+setters
}

Código para persistir y obtener datos del almacén de datos:

public Boolean testCourse(){
 Boolean isSaved = false;
 PersistenceManager pm = PMF.get().getPersistenceManager();
 Course c = new Course();
 try{
  List<Tag> tags = new ArrayList<Tag>();
  tags.add(new Tag("tag1"));
  tags.add(new Tag("tag2"));
  tags.add(new Tag("tag3"));


  c.setTitle("Course Title - " + new Date().getTime());
  c.setPrice(99.90);
  c.setTags(tags);

  System.out.println(c.toString()); // **Output:** ID: null Title: Course Title - 1247116147858, Price: 99.9, No. of Tags: 3
  pm.makePersistent(c);

  Course cAfter = pm.getObjectById(Course.class, KeyFactory.stringToKey(c.getId()));
  System.out.println(cAfter.toString()); // **Output:** agptYRtzaWL4gZDb3Vy4ErYFgw Title: Course Title - 1247116147858, Price: 99.9, No. of Tags: 3
  isSaved = true;
 }
 catch(Exception e){
  e.printStackTrace();
  isSaved = false;
 }
 finally{
  pm.close();
 }


 pm = PMF.get().getPersistenceManager();

 try{

  Course cAfterClose = pm.getObjectById(Course.class, KeyFactory.stringToKey(c.getId()));
  System.out.println(cAfterClose.toString()); // **Error**: See below
 }
 catch(Exception e){e.printStackTrace();}
 finally{pm.close();}


 return isSaved;
}

Aquí está el resultado:

IDENTIFICACIÓN:nuloTítulo:Título del curso - 1247117389679, precio:99,9, núm.de etiquetas:3 ID:agptYWtzaW1zYXBwcgwLEgZDb3Vyc2UYGAwTítulo:Título del curso - 1247117389679, Precio:99,9, núm.de etiquetas:3 java.lang.nullpointerexception en com.athena.server.entity.course.ToString (curso.java:94) en (Método nativo) en Sun.Reflect.nativemethodaccessorImpl.invoke (nativemethodaccessorImpl.java:39) en sun.reflect.delegatingMethodaccessorImpl.invoke (delegateoMethodaccessorM.Java:25) en java.lang.reflect.method. ) en com.google.gwt.user.server.rpc.rpc.invokeandencoderesponse (rpc.java:527) en com.google.gwt.user.server.rpc.remoteserviceservlet.processcall (remoteserviceservlet.Java:166) en com. google.gwt.user.server.rpc.remoteserviceservlet.dopost (remoTeserviceservlet.java:86) en javax.servlet.http.httpservlet.service (httpservlet.java:713) en javax.servlet.http.httpservet.servetlet (htttttlet. Java: 806) en org.mortbay.jetty.servlet.servletholder.handle (servletholder.java:487) en org.mortbay.jetty.servlet.servlethandler $ cachedchain.dofilter (servlethandler.java:1093) en com.google.appHostingHostingHostingHosting .Utils.servlet.transactionCleanUpfilter.dofilter (TransactionCleanUpfilter.java:43) en org.mortbay.jetty.servlet.servlethandler $ cachedchain.dofilter (servlethandler.Java:1084) en Org.mortbay.jetty.servlet.servletletlethandler (Servlethhandleter .Java: 360) en org.mortbay.jetty.security.securityhandler.handle (SecurityHandler.Java:216) en org.mortbay.jetty.servlet.sessionhandler.handle (sessionhandler.java:181) en org.mortbay.jetty. handler.contexthandler.handle (contrexthandler.java:712) en org.mortbay.jetty.webapp.webappcontext.handle (webappContext.java:405) en com.google.apphosting.utilils.jetty.devappengenwappappappontext.handle (devappengenwebappeltext: 54) en org.mortbay.jetty.handler.handlerwrapper.handle (handlerwrapper.java:139) en com.google.appengine.tools.development.jettyContainerService $ apiproxyhandler.handle (jettycontainererService.Java:306) en Org.mortbay.Jetty.Jetty .Handler.HandlerWrapper.Handle (Handlerwrapper.Java:139) en org.mortbay.jetty.server.handle (server.java:313) en org.mortbay.jetty.httpconnection.handlerequest (httpconnection.Java:506) en Org. mortbay.jetty.httpconnection $ requesthandler.content (httpconnection.java:844) en org.mortbay.jetty.httpposer.parsenext (httppoRser.java:644) en org.mortbay.jetty.httpPPser.parseVeavable (httpPPserable (httpPPser. en org.mortbay.jetty.httpconnection.handle (httpconnection.java:381) en orgía .Java: 442)

Sé que este error significa que la cadena es nula.Pero el registro está en la base de datos.Y hay que persistir.¿Por qué los datos están en blanco?

¿Alguna sugerencia de por qué me está pasando esto?

¿Fue útil?

Solución

He tenido más suerte usando uno sin dueño a muchas relaciones. Esencialmente sus listas son reemplazados con un conjunto de objetos clave.

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

Otros consejos

No sé exactamente cuál es la causa de su error, pero aquí hay algunos pasos que puede tratar de ayudar a solucionar:

En primer lugar, tratar de reducir su problema como un caso de prueba pequeña como sea posible. Usted tiene un montón de clases publicado anteriormente, y lo más probable es que este problema podría ser duplicado con sólo 2 o tal vez 3 de ellos.

En segundo lugar, si usted realmente quiere ver exactamente lo que sus entidades se ven como en el almacén de datos, tendrá que hacer algo como esto (o usted podría intentar subir tu aplicación a App Engine y ejecutarlo allí, por lo que podría utilizar su DataViewer):

Query q = pm.newQuery(Course.class);
List<Course> list = (List<Course>) q.execute();
for(Course c: list){
  System.out.println("Course id:" + c.getId());
  System.out.println("Course title:" + c.getTitle());
  //...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top