Pregunta

Veo una pregunta similar en Problemas mientras se ahorra un objeto pre-persistido en (Java) Google App Engine, y de hecho yo no estaba llamando a close () en mi gestor de persistencia. Sin embargo, ahora estoy llamando cerca, pero mi actualización de objeto no es de persistencia. En concreto, quiero eliminar un elemento de un conjunto, y guardar ese conjunto más pequeño. Aquí está el gestor de persistencia código relacionado, que no lanza una excepción, pero no guarda mis datos:

    UserService userService = UserServiceFactory.getUserService();
    User user = userService.getCurrentUser();

    PersistenceManager pm = PMF.get().getPersistenceManager();
    UserProfileInfo userProfile = pm.getObjectById(UserProfileInfo.class,user.getUserId());
    int presize = userProfile.getAccounts().size();
    AccountInfo ai = userProfile.removeAccount(id);
    int postsize = userProfile.getAccounts().size();
    UserProfileInfo committed = (UserProfileInfo)pm.makePersistent(userProfile);
    int postcommitsize = committed.getAccounts().size();
    pm.close();

Y aquí está la parte pertinente de la clase UserProfileInfo:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
class UserProfileInfo {
  @Persistent
  private Set<AccountInfo> accounts;

public AccountInfo removeAccount(Long id) throws Exception {
    Iterator<AccountInfo> it = accounts.iterator();
    StringBuilder sb = new StringBuilder();
    while(it.hasNext()) {
        AccountInfo acctInfo = it.next();
        Long acctInfoId = acctInfo.getId();
        if(acctInfoId.equals(id)) {
            it.remove();
            return acctInfo;
        }
        sb.append(" ");
        sb.append(acctInfoId);
    }
    throw new Exception("Cannot find id " + id + " Tried " + sb.toString());
  }
}
¿Fue útil?

Solución

Así que parece que la respuesta es propiedad objetos no pueden utilizar una clave primaria largo. El potenciador DataNucleus me dijo esto para otro tipo de objeto, añadí. No estoy seguro de por qué se omite esta advertencia para mi objeto de Cuenta.

Cambié mi llave a una cadena, y ha cambiado las anotaciones al utilizar la cadena correctamente, y ahora soy capaz de eliminar de la colección.

Otros consejos

Yo habría pensado que lo primero que hay que hacer cuando la depuración nada sería buscar en el registro (nivel de depuración). Se da a conocer lo que establece los objetos están en los diferentes puntos. Entonces, ¿qué estado está en cuando se llama makePersistent ()? y después ? y lo que ocurre cuando se llama pm.close () ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top