Domanda

Vedo una domanda simile in Problemi durante il salvataggio di un oggetto pre-persistito nel Google App Engine (Java) , e in effetti non stavo chiamando close () sul mio gestore di persistenza. Tuttavia, ora sto chiamando vicino, ma il mio aggiornamento oggetto non viene persisteva. In particolare, voglio rimuovere un elemento da un set, e salvare quel set più piccoli. Ecco il gestore di persistenza codice relativo, che non un'eccezione, ma non salva miei dati:

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

E qui è la parte rilevante della classe 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());
  }
}
È stato utile?

Soluzione

Quindi sembra che la risposta è di proprietà degli oggetti non possono utilizzare una chiave primaria a lungo. Il potenziatore DataNucleus mi ha detto questo per un altro tipo di oggetto ho aggiunto. Io non sono sicuro perché è saltato questo avvertimento per il mio oggetto AccountInfo.

ho acceso la mia chiave verso una stringa, e ha cambiato le annotazioni di utilizzare la stringa correttamente, e ora sono in grado di eliminare dalla collezione.

Altri suggerimenti

avrei pensato che la prima cosa da fare quando il debug qualsiasi cosa potrebbe essere quella di guardare il log (livello di debug). Si dice che cosa afferma gli oggetti sono in in diversi punti. Quindi, in che stato è a quando si chiama makePersistent ()? e dopo ? e cosa succede quando si chiama pm.close () ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top