Pergunta

Eu vejo uma pergunta semelhante em Problemas ao salvar um objeto pré-persistiu em Google App Engine (Java) , e na verdade eu não estava chamando close () no meu gerenciador de persistência. No entanto, agora estou chamando perto, mas a minha atualização objeto não está sendo persistiu. Especificamente, eu quero remover um elemento de um conjunto, e salvar esse conjunto menor. Aqui é o gerenciador de persistência código relacionado, que não lançar uma exceção, mas não guarda os meus dados:

    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 aqui está a parte relevante da 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());
  }
}
Foi útil?

Solução

Portanto, parece que a resposta é de propriedade de objetos não pode usar uma chave primária longa. O potenciador DataNucleus me disse isso para um outro tipo de objeto que eu adicionei. Eu não sei por que ele ignorou este aviso para o meu objeto AccountInfo.

Eu troquei minha chave ao longo de um String, e mudou as anotações para usar a string corretamente, e agora eu sou capaz de excluir da coleção.

Outras dicas

Eu teria pensado que a primeira coisa a fazer quando a depuração qualquer coisa seria a olhar para o log (nível de depuração). Diz-lhe o que afirma os objetos estão em nos diferentes pontos. Então, o estado é que quando você chamar makePersistent ()? e depois ? eo que acontece quando você chama pm.close () ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top