Domanda

I chiesto domanda prima di chiedere se è possibile salvare composizione di classe nel complesso al Google datastore all'interno di Google AppEngine con Java, ma non sono stato abbastanza chiaro e pigro per inviare tutta la mia classe, ma dopo un sacco di ore di lotta che iniziano rinunciare. Così qui è questione più dettagliata con il codice.

So che questo genere di cose dovrebbe funzionare bene, ma per qualche motivo sconosciuto a me questo non sta funzionando. Il problema è che quando sto risparmiando il mio oggetto e stretta connessione db riaprire i dati è vuoto in quell'oggetto. L'oggetto è nel database, lo vedo quando sto selezionando ID di tale oggetto, ma tutto il resto è vuoto. Purtroppo Google non ha visualizzatore di database per vedere cosa c'è in quel database. Ho provato a cercare e chiedere per uno ma non ha avuto fortuna . (C'è uno ma è non funziona sul mio computer ) Così, qui andiamo:

Contenuti

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

Corso

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

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
}

Codice a persistere e ottenere i dati da archivio dati:

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

Ecco l'output:

  

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

So che questo errore significa che la stringa è nullo. Ma il record è nel database. E dovrebbe essere persistono. Perché il vuoto di dati ???

Tutti i suggerimenti perché questo sta accadendo a me?

È stato utile?

Soluzione

Ho avuto la fortuna più utilizzando uno senza proprietario per molti rapporti. In sostanza le vostre liste vengono sostituiti con una serie di oggetti chiave.

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

Altri suggerimenti

Non so esattamente che cosa sta causando il vostro errore, ma qui ci sono pochi passi si può cercare di aiutare a risolvere:

In primo luogo, cercare di circoscrivere il problema come un banco di prova piccolo possibile. Hai un sacco di classi postato sopra, e molto probabilmente questo problema potrebbe essere duplicato con solo 2 o forse 3 di loro.

In secondo luogo, se si vuole veramente vedere esattamente ciò che i soggetti sembrano nel datastore, dovrete fare qualcosa di simile (o si potrebbe provare a caricare la vostra applicazione per AppEngine e correre lì, così si potrebbe utilizzare il loro 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());
  //...
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top