0

Ich habe eine Entity Course, die einen Schlüssel zu einer anderen Entität (Dokument) enthält.Google DataStore speichert keine untergeordneten Objekte

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

In einigen Test-Code mache ich einen neuen Kurs Einheit, und weisen Sie ein neues Dokument Einheit, und das Dokument-Entity beibehalten, wenn ich die Dokumenteigenschaft auf Kurs gesetzt. Wenn ich Kurs behalte, wird es ohne Fehler fortbestehen, aber sobald es beibehalten wird, wird die Dokumenteigenschaft null sein.

Irgendwelche Ideen? Hier ist meine Sparfunktion für den Kurs:

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; 

} 

bearbeiten hinzuzufügen:

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

von DocumentServicesImpl:

public Key saveAndGetKey(Document d) { 
    try{ 
    if (d.getKey() == null){ 
    save(d); 
    } 

    return d.getKey(); 
    } catch (Exception e){ 
    return null; 
    } 
} 

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

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

    return isSaved; 

} 

öffentlichen Dokument getDocumentById (Long id) {

PersistenceManager pm = PMF.get(). GetPersistenceManager(); Dokument d = neues Dokument();

versuchen { d = pm.getObjectById (Document.class, id); } schließlich { pm.close(); }

zurück d; }

Antwort

1
  • Was bedeutet die Klasse Dokument aussehen wie?
  • Wie sieht die DocumentServiceImpl-Klasse aus?
  • Wie sieht Ihr Unit-Test für saveAndGetKey() aus? Prüft es, ob der Rückgabewert ein gültiger Schlüssel ist? Können Sie dann dieses Dokument im Datenspeicher nachschlagen?
  • Sind Ihre ServiceImpl-Klassen PersistenceCapable oder PersistenceAware? Ich bin mir nicht sicher, ob sie nur auf dem basieren müssen, was Sie uns gezeigt haben oder nicht.

Neue Fehlerbehebung Idee unten: Was passiert, wenn Sie versuchen, etwas Einfaches wie das geschieht: Gerade jetzt, machen Course.document Öffentlichkeit. Dann sehen Sie, ob diese einfachere Art, Ihre Entitäten zu erstellen, funktioniert.

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(); 
+0

Ich habe meine Frage oben bearbeitet, um den angeforderten Code bereitzustellen. Meine saveAndGetKey-Funktion scheint zu funktionieren, wenn Sie mit dem Debugger durchgehen, wird ein Schlüsselwert generiert. – KevMo

+0

Nachdem Sie alles gesagt und getan haben, können Sie sowohl das neue Dokument als auch den neuen Kurs im Datenspeicher sehen und beide mit ihren Schlüsseln abfragen, aber der Kurs hat null für das Dokument? Außerdem gebe ich eine weitere Sache, um in meiner Antwort über –

+0

versuchen nicht sicher, ob es verwandt ist, aber Document.setId() verwendet die KeyFactory, um Schlüssel zu erstellen, aber saveAndGetKey (Document) wird GAE den Schlüssel erstellen, wenn Document .key ist null. Möchten Sie, dass GAE Dokument-IDs oder Ihre App generiert? – NamshubWriter