Question

posé la question avant de demander s'il est possible d'enregistrer composition de classe complexe à Google dans Google AppEngine Datastore avec Java, mais je n'étais pas assez clair et paresseux pour poster toute ma classe, mais après beaucoup d'heures de lutte, je commence à abandonner. Voici donc la question plus détaillée avec le code.

Je sais que ce genre de choses devrait fonctionner correctement, mais pour une raison inconnue pour moi, ce ne fonctionne pas. Le problème est que quand je sauve mon objet et le lien étroit de db puis ouvrez à nouveau les données est vide dans cet objet. L'objet est dans la base de données, je peux le voir quand je sélectionne ID de cet objet, mais tout le reste est vide. Malheureusement, Google n'a pas visionneuse de base de données pour voir ce qui est dans cette base de données. J'ai essayé de rechercher et de demander pour un, mais pas eu de chance . (Il y a un mais ne fonctionne pas sur mon ordinateur ) Alors, on y va:

Contenu

// 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
}

Cours

// 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();
 }

}

Vidéo

// 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
}

Document

// 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
}

balise

// 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
}

Code de persister et obtenir des données de datastore:

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

Voici la sortie:

  

ID: nullTitle: Titre du cours -   1247117389679, Prix: 99,9, Nombre de   Tags: 3   ID: agptYWtzaW1zYXBwcgwLEgZDb3Vyc2UYGAwTitle:   Titre du cours - 1247117389679, Prix:   99,9, n ° de Tags: 3 à java.lang.NullPointerException   com.athena.server.entity.Course.toString (Course.java:94)    à   com.athena.server.CourseServiceImpl.testCourse (CourseServiceImpl.java:146)    à   sun.reflect.NativeMethodAccessorImpl.invoke0 (natif   Méthode) à   sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39)    à   sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)    à   java.lang.reflect.Method.invoke (Method.java:585)    à   com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse (RPC.java:527)    à   com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall (RemoteServiceServlet.java:166)    à   com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost (RemoteServiceServlet.java:86)    à   javax.servlet.http.HttpServlet.service (HttpServlet.java:713)    à   javax.servlet.http.HttpServlet.service (HttpServlet.java:806)    à   org.mortbay.jetty.servlet.ServletHolder.handle (ServletHolder.java:487)    à   org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1093)    à   com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter (TransactionCleanupFilter.java:43)    à   org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1084)    à   org.mortbay.jetty.servlet.ServletHandler.handle (ServletHandler.java:360)    à   org.mortbay.jetty.security.SecurityHandler.handle (SecurityHandler.java:216)    à   org.mortbay.jetty.servlet.SessionHandler.handle (SessionHandler.java:181)    à   org.mortbay.jetty.handler.ContextHandler.handle (ContextHandler.java:712)    à   org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java:405)    à   com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle (DevAppEngineWebAppContext.java:54)    à   org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:139)    à   com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler.handle (JettyContainerService.java:306)    à   org.mortbay.jetty.handler.HandlerWrapper.handle (HandlerWrapper.java:139)    à   org.mortbay.jetty.Server.handle (Server.java:313)    à   org.mortbay.jetty.HttpConnection.handleRequest (HttpConnection.java:506)    à   org.mortbay.jetty.HttpConnection $ RequestHandler.content (HttpConnection.java:844)    à   org.mortbay.jetty.HttpParser.parseNext (HttpParser.java:644)    à   org.mortbay.jetty.HttpParser.parseAvailable (HttpParser.java:211)    à   org.mortbay.jetty.HttpConnection.handle (HttpConnection.java:381)    à   org.mortbay.io.nio.SelectChannelEndPoint.run (SelectChannelEndPoint.java:396)    à   org.mortbay.thread.BoundedThreadPool $ PoolThread.run (BoundedThreadPool.java:442)

Je sais que cette erreur signifie que la chaîne est nulle. Mais le dossier est dans la base de données. Et il faut persister. Pourquoi l'ébauche de données ???

Toutes les suggestions pourquoi cela me passe?

Était-ce utile?

La solution

J'ai eu le plus de chance à l'aide d'un unowned à de nombreuses relations. Essentiellement vos listes sont remplacées par un ensemble d'objets clés.

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

Autres conseils

Je ne sais pas exactement ce qui cause votre erreur, mais voici quelques étapes, vous pouvez essayer de vous aider à résoudre:

Tout d'abord, essayez de réduire votre problème comme petit un test possible. Vous avez beaucoup de classes affiché ci-dessus, et le plus probable que ce problème pourrait être dupliqué avec seulement 2 ou peut-être trois d'entre eux.

Deuxièmement, si vous voulez vraiment voir exactement ce que vos entités ressemblent dans le magasin de données, vous aurez à faire quelque chose comme ça (ou vous pouvez essayer de télécharger votre application en cours d'exécution et AppEngine là, pour que vous puissiez utiliser leur 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());
  //...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top