2009-07-09 54 views
1

asked question询问是否有可能使用Java将复杂的类组合保存到Google AppEngine中的Google Datastore中,但我并不清楚并懒得发布我的所有类,但是经过很多小时的斗争,我开始放弃。所以这里有更详细的代码问题。从Google Datastore获取对象后空白

我知道这种东西应该可以正常工作,但对于某些未知的原因,对我来说这不起作用。问题是,当我保存我的对象并关闭数据库连接,然后再次打开它的数据在该对象中是空白的。该对象在数据库中,当我选择该对象的ID时,我可以看到它,但其他所有内容都是空白的。不幸的是,Google没有数据库查看器来查看数据库中的内容。我试图搜索和ask一个,但没有运气。 (有one但它的not working on my computer) 所以,在这里我们去:

内容

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

这里是输出:

ID:nullTitle:课程名称 - 1247117389679,价钱:99.9,的 标签号:3 ID:agptYWtzaW1zYXBwcgwLEgZDb3Vyc2UYGAwTitle: 课程名称 - 1247117389679,价钱: 99.9,标签号: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(原生 方法) 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) at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166) at com.google.gwt.user.server.rpc .RemoteServiceServlet.doPost(RemoteServiceServlet.java:86) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:713) 在 的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 。内容(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) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396) 在 org.mortbay.thread.BoundedThreadPool $ PoolThread.run(BoundedThreadPool.java:442)

我知道这个错误意味着该字符串为空。但是记录在数据库中。它应该坚持下去。为什么数据是空白的?

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

回答

1

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

首先,尝试将问题缩小到尽可能小的测试用例成为可能。你有很多上面发布的类,很可能这个问题只有2个或3个可能被复制。其次,如果你确实想看到你的实体在数据存储中的样子,你必须做这样的事情(或者你可以尝试上传你的应用到appengine并在那里运行它,这样你就可以使用他们的数据查看器):

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