Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Google数据存储未存储子对象_Java_Google App Engine_Datanucleus_Google Cloud Datastore - Fatal编程技术网

Java Google数据存储未存储子对象

Java Google数据存储未存储子对象,java,google-app-engine,datanucleus,google-cloud-datastore,Java,Google App Engine,Datanucleus,Google Cloud Datastore,我有一个实体课程,里面有另一个实体(文档)的密钥 @PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true") public class Course{ @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Key key; @Persistent private Key d

我有一个实体课程,里面有另一个实体(文档)的密钥

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class Course{

 @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

 @Persistent private Key document;

public Document getDocument() {
  if (document != null)
  return new DocumentServiceImpl().getDocumentById(document.getId());
  return null;
 }
public void setDocument(Document document) {
  if (document != null)
   this.document = new DocumentServiceImpl().saveAndGetKey(document);
 }
在一些测试代码中,我创建了一个新的课程实体,并分配了一个新的文档实体,当我在课程上设置Document属性时,文档实体被持久化。当我坚持这个过程时,它将毫无错误地坚持下去,但是一旦坚持下去,文档属性将为空

有什么想法吗?以下是我的课程保存功能:

public Boolean save(Course c){
  Boolean isSaved = false;
  PersistenceManager pm = PMF.get().getPersistenceManager();

  try{   
   pm.makePersistent(c);
   isSaved = true;
  }
  catch(Exception e){
   e.printStackTrace();
   isSaved = false;
  }
  finally{
   pm.close();
  }

  return isSaved;

 }
编辑以添加:

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable="true")
public class Document{
 @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

 @Persistent private String   data;
 @Persistent private Set<Key>  dTags;
 @Persistent private Date   dateCreated;
 @Persistent private Date   dateEdited;

 public Document(){
  this.dateCreated = new Date();
 }

 public Long getId() {
  if (key == null){
   return null;
  } else {
   return key.getId();
  }
 }
 public void setId(Long id) {
  if (id != null)
  key = KeyFactory.createKey(this.getClass().getSimpleName(), id);
 }
公共文档getDocumentById(长id){

PersistenceManager pm=PMF.get().getPersistenceManager(); 文件d=新文件()

试一试{ d=pm.getObjectById(Document.class,id); }最后{ pm.close(); }

返回d; }

  • 文档类看起来是什么 比如说
  • DocumentServiceImpl类看起来像什么
  • 你的单元测试是为了什么 saveAndGetKey()看起来像什么?它是否检查返回值是否为有效键?然后你能在数据存储中查找该文档吗
  • 您的ServiceImpl类是什么 持久性,或 坚持意识?我不确定他们是否需要仅仅根据你给我们展示的东西
新的故障排除思路如下: 如果您尝试这样简单的方法会发生什么: 现在,将Course.document公开。然后看看这种创建实体的简单方法是否有效

pm = yourPMfactory.getPersistenceManger();
Course c = new Course();
Document d = new Document();
c.document = d;
pm.makePersistent(c);

Key myKey = c.getKey();
Course c2 = (Course) pm.getObjectById(Course.class, myKey.getId());
assertTrue(c.document != null); //or however your favorite test suite does assertions.
pm.close();

我已经编辑了上面的问题,以提供所需的代码。我的saveAndGetKey函数在使用调试器单步执行时似乎起作用,会生成一个键值。因此,在完成所有操作后,您可以在数据存储中同时看到新文档和新课程,并使用它们的键查询它们,但课程中的文档为空?另外,我在上面的回答中添加了另一个要尝试的内容,不确定它是否相关,但是Document.setId()正在使用KeyFactory创建键,但是如果Document.key为null,则saveAndGetKey(Document)将导致GAE生成键。你想让GAE生成文档ID还是你的应用程序?好吧,那代码行得通。经过一点调整后,它现在可以正常工作了。我的测试代码就是问题所在。谢谢你的帮助。NamshubWriter:我使用GAE生成密钥,但我也有DTO对象,这些对象被发送到具有长id的客户端。这些函数使我能够无缝地将一个对象转换为另一个对象。
pm = yourPMfactory.getPersistenceManger();
Course c = new Course();
Document d = new Document();
c.document = d;
pm.makePersistent(c);

Key myKey = c.getKey();
Course c2 = (Course) pm.getObjectById(Course.class, myKey.getId());
assertTrue(c.document != null); //or however your favorite test suite does assertions.
pm.close();