我正在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)。
所以我的问题是如何读取在同一事务中持续存在的数据..?
答案 0 :(得分:0)
你做不到。您应该重新阅读GAE交易文档。
简要说明:事务中的所有内容都可以获得数据存储区外观“快照”的一致视图,因此新查询不会显示在查询中。
但是,你有持久化的项目对象,所以你应该使用它而不是查询它。
如果您需要进行查询,则需要手动将其与您在交易中创建的实体“加入”。