Frage

gestellte Frage vor der Frage, ob es möglich ist, zu speichern, komplexe Klassenzusammensetzung in den Google-Datenspeichern innerhalb von Google App Engine mit Java, aber ich war nicht klar genug und faul all meine Klassen zu schreiben, aber nach vielen Stunden des Kampfes beginne ich aufgeben. So, hier ist detaillierteren Frage mit dem Code.

Ich weiß, diese Art von Sachen gut funktionieren sollte, aber aus irgendeinem unbekannten Grund mir dieses funktioniert nicht. Das Problem ist, dass, wenn ich meine Aufgabe bin Speicher und schließen DB-Verbindung dann öffnet wieder die Daten leer ist in diesem Objekt. Das Objekt befindet sich in der Datenbank, kann ich es sehen, wenn ich ID dieses Objekts bin der Auswahl, aber alles andere ist leer. Leider ist Google nicht Datenbank-Viewer, um zu sehen, was in dieser Datenbank ist. Ich habe versucht, zu suchen und fragen hatte aber kein Glück . (Es gibt ein aber es ist nicht auf meinem Computer arbeiten) Also, hier gehen wir:

Content

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

Kurs

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

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 bestehen und erhält Daten aus Datenspeichern:

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

Hier ist die Ausgabe:

  

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

Ich weiß, dass dieser Fehler bedeutet, dass die Zeichenfolge null ist. Aber der Datensatz in der Datenbank. Und es ist zu beharren. Warum ist die Daten leer ???

Irgendwelche Vorschläge, warum dies geschieht mit mir?

War es hilfreich?

Lösung

Ich habe das meiste Glück mit unowned man zu viele Beziehungen hatte. Im Wesentlichen erhalten Sie Ihre Listen mit einer Reihe von Schlüsselobjekten ersetzt.

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

Andere Tipps

Ich weiß nicht genau, was Ihre Fehler verursacht, aber hier sind ein paar Schritte, die Sie versuchen können, Fehlerbehebung helfen:

Als erstes versuchen, Ihr Problem zu einem möglichst kleinem Testfall wie möglich zu verengen. Sie haben eine Menge von Klassen, die oben geschrieben, und wahrscheinlich dieses Problem mit nur 2 oder vielleicht 3 von ihnen dupliziert werden könnte.

Zweitens, wenn Sie wirklich sehen wollen, genau das, was Ihre Entitäten aussehen wie in den Datenspeicher, werden Sie so etwas zu tun haben (oder könnten Sie versuchen, Ihre Anwendung Hochladen auf appengine und dort ausgeführt wird, so dass Sie verwenden konnten ihre 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());
  //...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top