问个问题 在提问前,如果这可能节省的复杂类的组成在谷歌数据存储库的内部谷歌AppEngine Java,但我是不是足够清楚和懒惰以发布的所有上我的课,但是在很多个小时的斗争,我开始放弃。因此,这里是更多详细问题的代码。

我知道这样的东西应的工作很好,但由于某种未知的原因我这不是工作。问题是,当我在拯救我的对象和近的数据库连接,然后再次打开它的数据是空白,对象。目的是在数据库中,我可以看见它时我选择ID的对象,但其他一切都是空白。不幸的是谷歌没有数据库的观众看到什么是在该数据库。我试图搜索和 问问 对于一个而是没有运气。(有 一个 但它的 没有工作我的电脑上) 所以,在这里,我们去:

的内容

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

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

}

视频

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

文档

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

标记

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

代码保存和获取数据,从数据存储:

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

这里是输出:

标识:nullTitle:课程标题- 1247117389679,价格:99.9,没有。的 标签:3 标识:agptYWtzaW1zYXBwcgwLEgZDb3Vyc2UYgawtitle:课程标题-1247117389679,价格:99.9,没有。标签:3java。郎。异常在 com.雅典娜。服务器。实体。课程。toString(课程。java:94) 在 com.雅典娜。服务器。CourseServiceImpl.testCourse(CourseServiceImpl.java:146) 在 太阳。反映。NativeMethodAccessorImpl.invoke0(母 法)在 太阳。反映。NativeMethodAccessorImpl.援引(NativeMethodAccessorImpl.java:39) 在 太阳。反映。DelegatingMethodAccessorImpl.援引(DelegatingMethodAccessorImpl.java:25) 在 java。郎。反映。法。调用(方法。java:585) 在 com.谷歌。应用程序.用户。服务器。rpc。RPC。invokeAndEncodeResponse(RPC。java:527) 在 com.谷歌。应用程序.用户。服务器。rpc。RemoteServiceServlet.processCall(RemoteServiceServlet.java:166) 在 com.谷歌。应用程序.用户。服务器。rpc。RemoteServiceServlet.doPost(RemoteServiceServlet.java:86) 在 内servlet。http。HttpServlet.服务(HttpServlet.java:713) 在 内servlet。http。HttpServlet.服务(HttpServlet.java:806) 在 org.mortbay.码头。servlet。ServletHolder.处理(ServletHolder.java:487) 在 org.mortbay.码头。servlet。ServletHandler$CachedChain.doFilter(ServletHandler.java:1093) 在 com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 在 org.mortbay.码头。servlet。ServletHandler$CachedChain.doFilter(ServletHandler.java:1084) 在 org.mortbay.码头。servlet。ServletHandler.处理(ServletHandler.java:360) 在 org.mortbay.码头。安全。SecurityHandler.处理(SecurityHandler.java:216) 在 org.mortbay.码头。servlet。SessionHandler.处理(SessionHandler.java:181) 在 org.mortbay.码头。处理程序。ContextHandler.处理(ContextHandler.java:712) 在 org.mortbay.码头。webapp.WebAppContext.处理(WebAppContext.java:405) 在 com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54) 在 org.mortbay.码头。处理程序。HandlerWrapper.处理(HandlerWrapper.java:139) 在 com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306) 在 org.mortbay.码头。处理程序。HandlerWrapper.处理(HandlerWrapper.java:139) 在 org.mortbay.码头。服务器。处理(服务器。java:313) 在 org.mortbay.码头。HttpConnection.handleRequest(HttpConnection.java:506) 在 org.mortbay.码头。HttpConnection$RequestHandler.内容(HttpConnection.java:844) 在 org.mortbay.码头。HttpParser.parseNext(HttpParser.java:644) 在 org.mortbay.码头。HttpParser.parseAvailable(HttpParser.java:211) 在 org.mortbay.码头。HttpConnection.处理(HttpConnection.java:381) 在 org.mortbay.io.仁王.SelectChannelEndPoint.运行(SelectChannelEndPoint.java:396) 在 org.mortbay.螺纹。BoundedThreadPool$PoolThread.运行(BoundedThreadPool.java:442)

我知道这错误意味着string is null.但记录在数据库。它应该仍然存在。为什么是数据空白的???

任何建议,这是为什么发生在我身上?

有帮助吗?

解决方案

我已经使用无主的一对多关系的最幸运。基本上你的清单会被替换成一个集重点对象。

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

其他提示

我不知道到底是什么导致你的错误,但是这里有几个步骤,你可以尝试帮助排查:

首先,尝试将问题缩小到尽可能小的测试用例成为可能。你有很多的班级张贴以上,而最有可能的这个问题可能只有2或3也许它们被复制。

第二,如果你真的想看到你的实体看起来像在数据存储什么,你必须做这样的事情(或者你可以尝试上传您的应用程序AppEngine上并运行它在那里,所以你可以使用他们的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());
  //...
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top