Frage

Ich sehe eine ähnliche Frage in Probleme während einer vorge beharrte Objekt in Google App Engine (Java) speichern, und in der Tat war ich nicht in der Nähe () auf meinem Persistenz-Manager aufrufe. Aber ich bin jetzt Aufruf der Nähe, aber mein Objekt-Update wird nicht beibehalten werden. Insbesondere möchte ich ein Element aus einem Set entfernen, und dass die kleineren Satz speichern. Hier ist der Persistenz-Manager Code verwendet, die keine Ausnahme werfen, aber nicht meine Daten speichern:

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

Und hier ist der relevante Teil der UserProfileInfo Klasse:

@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());
  }
}
War es hilfreich?

Lösung

So sieht es aus wie die Antwort Objekte im Besitz können nicht langen Primärschlüssel verwenden. Der Datanucleus Enhancer erzählte mir diese für einen anderen Objekttyp I hinzugefügt. Ich bin mir nicht sicher, warum es diese Warnung für mein Objekt Accountübersprungen.

schaltete ich meinen Schlüssel über in einen String, und verändern die Anmerkungen die Zeichenfolge richtig zu nutzen, und jetzt bin in der Lage zu mir aus der Sammlung zu löschen.

Andere Tipps

Ich hätte gedacht, dass das erste, was zu tun ist, wenn etwas Debuggen im log (Debug-Level) zu buchen wäre. Es sagt Ihnen, was besagt, die Objekte sind in an den verschiedenen Punkten. Also, was Zustand ist, in es, wenn Sie makePersistent () aufrufen? und danach ? und was passiert, wenn Sie anrufen pm.close () ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top