Pergunta

a pergunta antes de perguntar se é possível salvar composição de classe complexo para o Google Datastore dentro do Google AppEngine com Java, mas não foi suficiente claro e preguiçoso para postar toda a minha classe, mas depois de muitas horas de luta eu começar a dar-se. Então aqui é a pergunta mais detalhada com o código.

Eu sei que este tipo de coisa deve funcionar bem, mas por alguma razão desconhecida para mim isso não está funcionando. O problema é que quando eu estou guardando o meu objeto e conexão db perto, em seguida, abra-o novamente os dados estão em branco no objeto. O objeto está em banco de dados, eu posso vê-lo quando eu estou selecionando ID do objeto, mas tudo o resto está em branco. Infelizmente o Google não tem visualizador de banco de dados para ver o que está no banco de dados. Tentei pesquisar e pedir para um, mas não teve sorte . (Há um mas de não funciona no meu computador ) Então, vamos lá:

Conteúdo

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

}

Vídeo

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

Código de persistir e obter dados de armazenamento de dados:

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

Aqui está a saída:

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

Eu sei que isso significa erro que a cadeia é nula. Mas o registro está em banco de dados. E deve-se persistem. Porque é que o espaço em branco dados ???

Todas as sugestões por que isso está acontecendo comigo?

Foi útil?

Solução

Eu tive mais sorte usando um sem dono para muitos relacionamentos. Essencialmente suas listas são substituídos com um conjunto de Key objetos.

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

Outras dicas

Eu não sei exatamente o que está causando o seu erro, mas aqui estão alguns passos que você pode tentar ajudar a solucionar:

Em primeiro lugar, tentar diminuir o seu problema como caso de teste uma pequena quanto possível. Você tem um monte de aulas postado acima, e, provavelmente, este problema poderia ser duplicado com apenas 2 ou talvez 3 deles.

Em segundo lugar, se você realmente quer ver exatamente o que suas entidades olhar como no armazenamento de dados, você vai ter que fazer algo assim (ou você poderia tentar o upload do seu aplicativo para appengine e executá-lo lá, então você poderia usar sua 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top