1

Google App Engine(Java)で永続化されたオブジェクトを保存しているときに、問題で同様の質問が表示されます。実際、永続性マネージャーでclose()を呼び出していませんでした。ただし、現在closeを呼び出していますが、オブジェクトの更新が保持されていません。具体的には、セットから要素を削除し、その小さいセットを保存したいと思います。永続性マネージャーに関連するコードは次のとおりです。例外はスローされませんが、データは保存されません。

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

そして、これが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());
  }
}
4

2 に答える 2

1

したがって、答えは所有されているように見えます。オブジェクトはLong主キーを使用できません。datanucleusエンハンサーは、私が追加した別のオブジェクトタイプについてこれを教えてくれました。AccountInfoオブジェクトに対してこの警告がスキップされた理由がわかりません。

キーを文字列に切り替え、文字列を適切に使用するように注釈を変更しました。これで、コレクションから削除できるようになりました。

于 2009-11-11T03:43:26.233 に答える
0

何かをデバッグするときに最初に行うことは、ログ(DEBUGレベル)を確認することだと思いました。これは、オブジェクトがさまざまなポイントにある状態を示します。では、makePersistent()を呼び出すと、どのような状態になりますか?以降 ?pm.close()を呼び出すとどうなりますか..。

于 2009-11-05T10:52:35.793 に答える