Exclusão de um conjunto de no Google App Engine não está sendo persistiu
-
16-09-2019 - |
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());
}
}
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 () ...