2009-04-17 7 views
6

J'expérimente Google App Engine et l'option de persistance JDO. Je voudrais savoir s'il est possible de mapper un objet transitoire à un objet persistant? Ou quelque chose pour mettre à jour l'objet persistant avec l'utilisation d'un objet transitoire?JDO - Mise à jour d'un objet

I les exemples de codage i voir le morceau de code suivant la mise à jour des objets:

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

Mais ce n'est pas ce que je veux, ce que quelqu'un sait si je peux mettre à jour l'ensemble de l'objet comme JPA fait: objet. mettre à jour();

donc je voudrais quelque chose comme ceci:

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

Répondre

2

Un objet « transitoire » n'a pas « identité » donc il n'y a aucun moyen de le localiser dans un magasin de données. Réfléchissez bien si vous voulez utiliser des objets transitoires ou s'il vaut mieux utiliser uniquement des objets détachés. JPA utilise l'équivalent d'un objet "détaché". JDO peut le faire aussi et ensuite vous appelez simplement pm.makePersistent (detachedObj);

--Andy (DataNucleus)

+0

makePersistent ne fonctionne pas si l'objet a déjà l'ensemble d'ID (par exemple, lorsqu'il est lu précédemment à partir de la banque de données, ou lorsque peuplé d'un formulaire Web). – pjesi

+1

Si l'objet est lu à partir du magasin de données et se trouve dans la même transaction, il est inutile d'appeler makePersistent, toutes les modifications sont automatiquement placées dans le magasin de données. Si l'objet est lu à partir du magasin de données, puis détaché et que vous modifiez quelque chose, l'appel de makePersistent fonctionne certainement car il joint les modifications. Si vous avez des problèmes spécifiques, je vous suggère de les signaler au groupe appengine de Google – DataNucleus