0

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

我写了几行代码来简单地测试和显示问题所在。此代码完美运行,并向我显示“找到项目”。

    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.0 RC1 和最新的 AE SDK (1.7)。

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

4

1 回答 1

0

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

简而言之:事务中的所有内容都获得了数据存储外观“快照”的一致视图,因此新的写入不会出现在查询中。

但是,您拥有持久化的项目对象,因此您应该使用它而不是查询一个。

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

于 2013-01-09T18:21:43.573 回答