2010-12-21 10 views
0

Ich versuche, JDO (und gleichzeitig seine GAE und Spring-Feinheiten) zu lernen, indem ich eine kleine Web-App erstelle und Probleme habe, aktualisierte Domain-Objekte zu bekommen, die in der Datenbank verbleiben. Ich greife zuerst die Entity aus der DB und lösche sie, damit ich sie dem Benutzer zeigen kann und erlaube ihnen, sie zu ändern. Sobald der Benutzer die Änderungen vorgenommen und das Formular zurück an die App gesendet hat, greife ich erneut die Entität aus der DB (getrennt), aktualisiere die Eigenschaften und rufe dann eine pm.makePersistent(). Der abgekürzte Code lautet wie folgt:Warum denkt JDO, dass dieses losgelöste Objekt sauber ist?

User Domain Objekt:

@PersistenceCapable(detachable="true") 
public class User extends BaseEntity { 
    @Persistent 
    private String firstName = ""; 
    @Persistent 
    private String middleInitial = ""; 
    @Persistent 
    private String lastName = ""; 
} 

DAO lesen Methode:

public User read(Key key) throws DataException { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    User pkg, detached = null; 
    try { 
     pkg = (User) pm.getObjectById(User.class, key); 
     detached = pm.detachCopy(pkg); 
     detached.setIsAlreadyInDB(true); 
    } 
    catch (Exception e) {   
     throw new DataException("An error occured trying to read the User object. Details:\n" + e.getMessage()); 
    } 
    finally { 
     pm.close(); 
    } 
    return detached; 
} 

DAO Update-Methode:

private void update(User pkg) throws DataException { 
    PersistenceManager pm = PMF.get().getPersistenceManager(); 
    Transaction tx = pm.currentTransaction(); 

    try { 
     tx.begin();   
     pm.makePersistent(pkg); 
     tx.commit(); 
    } 
    finally { 
     if (tx.isActive()) tx.rollback(); 
     pm.close(); 
    } 
} 

Nun, wenn ich nach unten kommen in die Update-Methode, habe ich mir selbst bewiesen, dass ich mit nur dem gleichen Objekt aus meinem lesen über die Überprüfung seiner 012 arbeite, ich habe einen Wert mithilfe der Setter-Methode des Domänenobjekts geändert. Ich habe den geänderten Wert sogar in die Konsole gedruckt, um sicherzustellen, dass er ausgeführt wird, und JDOHelper.isDirty() gibt immer noch false zurück, und daher werden keine der Änderungen in der Datenbank. Irgendwelche Gedanken darüber, was ich vermisse oder wenn ich mich dem aus dem falschen Winkel nähere? Danke, dass du einem JDO-Anfänger geholfen hast!

Antwort

1

JDOHelper.isDirty ist für verwaltete Objekte. Ein losgelöstes Objekt wird nicht verwaltet. DataNucleus stellt eine eigene Hilfsmethode zum Abrufen der Dirty-Felder bereit, während sie getrennt sind, da die Logik implementierungsspezifisch ist. String [] dirtyFieldNames = NucleusJDOHelper.getDetachedObjectDirtyFields (obj, pm);

+0

Vielen Dank für das, das habe ich beim Lesen der Dokumentation übersehen. Ich wundere mich immer noch, warum es nicht erkennt, dass sich Daten im losgelösten Objekt geändert haben, und daher die Änderungen nicht beharrt. – Joshua

+0

Deshalb hast du ein Protokoll, um dir solche Dinge zu erzählen – DataNucleus

Verwandte Themen