AppEngine:无法从事务中的数据存储读取持久数据

时间:2013-01-09 16:20:08

标签: java google-app-engine transactions google-cloud-datastore

我正在Google AppEngine上编写同步服务,但有些东西并不适合我。我想要做的是同步一个实体项目(也许它需要持久化,可能只是复制内容,谁知道),然后搜索一个类型为Project的实体(可能是同一个项目,如先保持,但不是'需要)然后用它来同步任务。 所有这些都需要在事务中发生,因此如果任务同步失败,项目也会被删除。

我编写了一些代码来简单地测试并显示出错了什么。 此代码完美运行,并向我显示“Project Found”。

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

我总是看到“找不到项目......”。那么我怎么能读到一个我刚刚坚持但尚未犯下的对象呢?

BTW:我正在使用twig-persist 2.0 RC1和最新的AE SDK(1.7)。

所以我的问题是如何读取在同一事务中持续存在的数据..?

1 个答案:

答案 0 :(得分:0)

你做不到。您应该重新阅读GAE交易文档。

简要说明:事务中的所有内容都可以获得数据存储区外观“快照”的一致视图,因此新查询不会显示在查询中。

但是,你有持久化的项目对象,所以你应该使用它而不是查询它。

如果您需要进行查询,则需要手动将其与您在交易中创建的实体“加入”。