2009-07-09 4 views
1

I asked question avant de vous demander s'il est possible d'enregistrer la composition complexe de la classe dans le magasin de données Google dans Google App Engine avec Java, mais je n'ai pas été assez clair et paresseux pour publier toute ma classe. après beaucoup d'heures de lutte, je commence à abandonner. Donc, voici une question plus détaillée avec le code.L'objet est vide après l'avoir reçu de Google Datastore

Je sais que ce genre de choses devrait bien fonctionner, mais pour une raison inconnue, cela ne fonctionne pas. Le problème est que lorsque je sauvegarde mon objet et ferme la connexion db puis l'ouvre à nouveau, les données sont vides dans cet objet. L'objet est dans la base de données, je peux le voir quand je sélectionne l'ID de cet objet mais tout le reste est vide. Malheureusement, Google n'a pas de visionneuse de base de données pour voir ce qu'il y a dans cette base de données. J'ai essayé de chercher et ask pour un mais n'a eu aucune chance. (Il y a one mais il est not working on my computer) 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 
} 

Tag

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

est ici la sortie:

ID: nullTitle: Titre du cours - 1247117389679, Prix: 99,9, Nombre de Tags: 3 ID: agptYWtzaW1zYXBwcgwLEgZDb3Vyc2UYGAwTitle: Titre du cours - 1247117389679, Prix: 99,9, Nombre 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) at javax.servlet.http.HttpServlet.service (HttpServlet.java:713) at 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) at org.mortbay.io.nio.SelectChannelEndPoint.run (SelectChannelEndPoint.java:396) at org.mortbay.thread.BoundedThreadPool $ PoolThread.run (BoundedThreadPool.java:442)

Je sais cette erreur signifie que la chaîne est nulle. Mais l'enregistrement est dans la base de données. Et cela devrait être persistant. Pourquoi les données sont-elles vides?

Des suggestions pour lesquelles cela m'arrive?

Répondre

1

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

d'abord, essayez de réduire votre problème comme petit un test possible. Vous avez beaucoup de cours postés ci-dessus, et très probablement ce problème pourrait être dupliqué avec seulement 2 ou peut-être 3 d'entre eux. Deuxièmement, si vous voulez vraiment voir exactement à quoi ressemblent vos entités dans la banque de données, vous devrez faire quelque chose comme ça (ou vous pourriez essayer de télécharger votre application sur appengine et de la lancer ici, donc vous pouvez 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()); 
    //... 
} 
Questions connexes