2009-04-17 17 views
6

Estoy experimentando con Google App Engine y la opción persistente JDO. Me gustaría saber si es posible mapear un objeto transitorio a un objeto persistente. ¿O algo para actualizar el objeto persistente con el uso de un objeto transitorio?JDO - Actualizando un Objeto

que los ejemplos de codificación Veo el siguiente fragmento de código para actualizar objetos:

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

pero esto no es lo que quiero, ¿Alguien sabe si puedo actualizar el objeto entero como APP hace: objeto. actualizar();

así que me gustaría algo como esto:

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

Respuesta

2

Un objeto "transitoria" no tiene "identidad", por lo que no hay manera de localizarlo en un almacén de datos. Piense cuidadosamente si quiere usar objetos transitorios, o si sería mejor usar objetos separados. JPA usa el equivalente de un objeto "separado". JDO también puede hacer eso y luego simplemente llama a pm.makePersistent (detachedObj);

--Andy (DataNucleus)

+0

makePersistent no funciona si el objeto ya tiene el conjunto de ID (por ejemplo, cuando se lee previamente desde el almacén de datos, o cuando se rellena a partir de un formulario web). – pjesi

+1

Si el objeto se lee del almacén de datos y está en la misma transacción, no tiene sentido llamar a makePersistent, los cambios se ponen automáticamente en el almacén de datos. Si el objeto se lee desde el almacén de datos y luego se separa y se cambia algo, llamar a makePersistent ciertamente "funciona" ya que adjunta los cambios. Si tiene problemas específicos, le sugiero que los informe al grupo appengine de Google – DataNucleus