0

Google AppEngineで同期サービスを作成していますが、実際には機能していません。私がやりたいのは、エンティティProjectを同期し(永続化する必要があるかもしれません。コンテンツをコピーするだけかもしれません)、Projectタイプのエンティティを検索します(最初に永続化されたものと同じプロジェクトかもしれませんが、そうではありません。する必要があります)そしてそれを使用してタスクを同期します。これらはすべてトランザクションで発生する必要があるため、タスク同期が失敗すると、プロジェクトも削除されます。

何が問題なのかを簡単にテストして示すために、数行のコードを記述しました。このコードは完全に機能し、「ProjectFound」を表示します。

    User user = userDao.findAll().get(0);

    // Create a setup service...
    Project project = new Project();
    project.setName("TEST ABC");
    project.setLastUpdated(new Date());
    project.setUser(user);
    projectDao.persist(project);

    Project persistedProject = projectDao.find("TEST ABC", user);

    if (persistedProject == null) {
        System.out.println("Project not found...");
    } else {
        System.out.println("Project found!");
    }

したがって、ここではトランザクションを使用しません。しかし、トランザクションでコードを実行すると、次のようになります。

    User user = userDao.findAll().get(0);

    Transaction tx = datastores.get().beginTransaction();

    // Create a setup service...
    Project project = new Project();
    project.setName("TEST ABC");
    project.setLastUpdated(new Date());
    project.setUser(user);
    projectDao.persist(project);

    Project persistedProject = projectDao.find("TEST ABC", user);

    if (persistedProject == null) {
        System.out.println("Project not found...");
        tx.rollback();
    } else {
        System.out.println("Project found!");
        tx.commit();
    }

いつも「プロジェクトが見つかりません...」と表示されます。では、永続化したばかりでまだコミットしていないオブジェクトをどのように読み取ることができますか?

ところで:私はtwig-persist 2.0RC1と最新のAESDK(1.7)を使用しています。

だから私の質問は、同じトランザクションでパーサイトされたデータをどのように読み取ることができるかということです。

4

1 に答える 1

0

できません。GAE トランザクションのドキュメントを読み直してください。

簡単に言えば、トランザクション内のすべてが、データストアがどのように見えるかの「スナップショット」の一貫したビューを取得するため、新しい書き込みはクエリに表示されません。

ただし、永続化したプロジェクト オブジェクトがあるため、クエリを実行する代わりにそれを使用する必要があります。

クエリを実行する必要がある場合は、トランザクション内で作成したエンティティと手動で「結合」する必要があります。

于 2013-01-09T18:21:43.573 に答える