2009-04-17 9 views
6

Ich experimentiere mit der Google App Engine und der persistenten Option JDO. Ich würde gerne wissen, ob es möglich ist, ein transientes Objekt einem persistenten Objekt zuzuordnen? Oder etwas, um das persistente Objekt mit einem transienten Objekt zu aktualisieren?JDO - Aktualisieren eines Objekts

ich die Codierung Beispiele i das folgende Stück Code siehe Objekte zu aktualisieren:

public void updateEmployeeTitle(User user, String newTitle) { 
PersistenceManager pm = PMF.get().getPersistenceManager(); 
try { 
    Employee e = pm.getObjectById(Employee.class, user.getEmail()); 
    if (titleChangeIsAuthorized(e, newTitle) { 
     e.setTitle(newTitle); 
    } else { 
     throw new UnauthorizedTitleChangeException(e, newTitle); 
    } 
} finally { 
    pm.close(); 
} 
} 

Aber das ist nicht das, was ich will, weiß jemand, wenn ich das ganze Objekt aktualisieren wie JPA tut: Objekt. aktualisieren();

So würde ich so etwas wie dies mag:

public User update(User u) { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    User usr; 
    try { 
     usr = pm.getObjectById(User.class, u.getId()); 
     // copy transient object u to persist object usr. 
        // on update of usr all changes in object u are persistent. 

    } finally { 
     pm.close(); 
    } 

    return u; 
} 

Antwort

2

A "transient" Objekt hat keine "Identität", so gibt es keine Möglichkeit, es in einem Datenspeicher zu finden ist. Überlegen Sie genau, ob Sie transiente Objekte verwenden möchten oder ob es besser wäre, einfach losgelöste Objekte zu verwenden. JPA verwendet das Äquivalent eines "gelösten" Objekts. JDO kann das auch und dann rufen Sie einfach pm.makePersistent (detachedObj);

--Andy (DataNucleus)

+0

makePersistent funktioniert nicht, wenn das Objekt bereits den ID Satz hat (beispielsweise wenn die zuvor aus dem Datenspeicher zu lesen, oder wenn von einer Bahnform aufgefüllt). – pjesi

+1

Wenn das Objekt aus dem Datenspeicher gelesen wird und sich in der gleichen Transaktion befindet, ist der Aufruf von makePersistent sinnlos. Änderungen werden automatisch in den Datenspeicher verschoben. Wenn das Objekt aus dem Datenspeicher gelesen und dann losgelöst wird und Sie etwas ändern, dann funktioniert das Aufrufen von makePersistent mit Sicherheit, da es die Änderungen anfügt. Wenn Sie bestimmte Probleme haben, schlage ich vor, dass Sie sie der Google-Appengine-Gruppe melden – DataNucleus