문제

질문을했습니다 Java와 함께 Google Appengine 내부의 Google DataStore에 복잡한 클래스 구성을 저장할 수 있는지 묻기 전에 모든 수업을 게시 할만 큼 명확하고 게으르지 않았지만 많은 시간을 보낸 후에는 포기하기 시작했습니다. 따라서 코드에 대한 더 자세한 질문이 있습니다.

나는 이런 종류의 것들이 잘 작동해야한다는 것을 알고 있지만 나에게 알려지지 않은 이유 때문에 이것은 작동하지 않습니다. 문제는 객체를 저장하고 DB 연결을 닫을 때 다시 열면 해당 객체의 데이터가 비어 있다는 것입니다. 객체는 데이터베이스에 있습니다. 해당 객체의 ID를 선택할 때 볼 수 있지만 다른 모든 것은 비어 있습니다. 불행히도 Google에는 해당 데이터베이스의 내용을 볼 수있는 데이터베이스 뷰어가 없습니다. 나는 검색을 시도했다 물어보기 하나는 그러나 운이 없었습니다. (있습니다 하나 그러나 그것은입니다 내 컴퓨터에서 작업하지 않습니다) 그래서 여기 우리는 간다 :

콘텐츠

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

DataStore에서 데이터를 유지하고 가져 오는 코드 :

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, No. of Tags : 3 Java.lang.nullpoineternecement. Entity.course.toString (course.java:94)에서 com.athena.server.courseserviceimpl.testcourse (courseserviceimpl.java:146)의 sun.reflect.nativeMethodaccessorimpl.invoke0 (기본 방법)의 sun.reflect.nativeMethodaccessorimpl. nativeMethodaccessorimpl.java:39)에서 sun.reflect.delegatingmethodaccessorimpl.invoke (java.lang.reflct.method.invoke (method.java:585)의 java.lang.reflect (java.lang.java:585)에서 sun.reflect.delegatingmethodaccessorimpl.invoke. com.google.gwt.user.server.rpc.remoteserviceservlet.processcall (recomoteserviceservlet.java:166)의 .rpc.invokeandencoderesponse (rpc.java:527). javax.servlet.httpservlet.service (httpservlet.java:713)의 javax.servlet.servle.htttp.httpservlet.servi org.mortbay.jetty.servlet.servletholder.handle (servletholder.java:487)의 CE (httpservlet.java:806) at org.mortbay.jetty.servlet.servlethandler $ cachedchain.dofilter (servlethler.java:1093) at Coma:1093). .google.apphosting.util.servlet.servlet.transactioncleanupfilter.dofilter (transactioncleanupfilter.java:43) at org.mortbay.jetty.servlet.servlethandler $ cachedchain.dofilter (servlethandler.java:1084)의 cachedchain.mortbay. org.mortbay.jetty.security.securityhandler.handle (org.mortbay.jetty.servlet.sessionhandler.handle (sessionhandler.java:181)의 .handle (servlethandler.java:360). org.mortbay.jetty.webapp.webappcontext.handle (webappcontext.java:405)의 mortbay.jetty.handler.handler.handler.handle (contexthandler.java:712) (contexthandler.java:712) (contexthandler.java:712) (com.google.apphosting.util.jetty.devappingnewebappontinwebappcontextcontextcontext. org.mortbay.jetty.handler.handlerwrapper.handle (handlerwrapper.java:139)의 devappenginewebappcontext.java:54) at com.google.appengine.tools.development.jettycont ainerservice $ apiproxyhandler.handle (org.mortbay.jetty.handler.handlerwrapper.handle (handlerwrapper.java:139) at org.mortbay.jetty.server.handle (java:313) at Org. .mortbay.jetty.httpconnection.handlerequest (httpconnection.java:506) at org.mortbay.jetty.httpconnection $ requesthandler.content (httpconnection.java:844) at org.mortbay.jetty.httpparser.parser.courser.courser.courser.coursext - ) org.mortbay.jetty.httpparser.parseavailable (httpparser.java:211) at org.mortbay.jetty.httpconnection.handle (httpconnection.java:381) org.mortbay.io.nio.run (selectchannelendpoint.run). java : 396)에서 org.mortbay.thread.boundedthreadpool $ poolthread.run (boundedthreadpool.java:442)

이 오류는 문자열이 널이라는 것을 의미합니다. 그러나 레코드는 데이터베이스에 있습니다. 그리고 그것은 지속되어야합니다. 데이터가 비어있는 이유는 무엇입니까 ???

왜 이것이 나에게 일어나고 있는지 제안하는 것이 있습니까?

도움이 되었습니까?

해결책

나는 무시하지 않은 하나에서 많은 관계를 사용하여 가장 운이 좋았습니다. 본질적으로 귀하의 목록은 주요 객체 세트로 대체됩니다.

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

다른 팁

오류의 원인이 무엇인지 정확히 모르지만 문제 해결을 도울 수있는 몇 가지 단계가 있습니다.

먼저 문제를 가능한 한 작은 테스트 사례로 좁히십시오. 위에 게시 된 수업이 많이 있으며,이 문제는 2 개 또는 3 개로 복제 될 수 있습니다.

둘째, DataStore에서 엔터티가 어떻게 보이는지 정확히보고 싶다면 이와 같은 작업을 수행해야합니다 (또는 앱을 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