查询在同一事务中找不到持久对象

时间:2013-03-20 14:36:08

标签: google-app-engine transactions persistence jdo

我有域对象,如下所示:

@PersistenceCapable(detachable="true")
public class UserData implements java.io.Serializable
{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Long id;

    @Persistent
    @NotNull
    private String openId;

    public UserData(String openId)
    {
        this.openId = openId;
    }
}

现在我创建一个UserData对象并使用JDO使其持久化:

UserData userData = ThreadLocalPMF.getPersistenceManager().makePersistent(new UserData(openId));

稍后在代码中我在同一个仍然打开的事务中执行查询,使用相同的PersistenceManager,相同的线程:

Query query = ThreadLocalPMF.getPersistenceManager().newQuery(UserData.class, "openId == :openId");
query.setUnique(true);
UserData userData = (UserData)query.execute(openId);

现在它发生了一次,查询确实返回了null而不是之前持久化某些代码行的对象。这有什么问题?这是一致性问题吗?该应用程序正在使用高复制数据存储区

<property name="datanucleus.appengine.datastoreEnableXGTransactions" value="true"/>

2 个答案:

答案 0 :(得分:0)

持久化具有标记为:

的id变量的对象时
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)

我目前还不能100%确定使用提供的ID保存对象。但我认为它将使用完全不同的ID值保存对象,因为它跟随valueStrategy

要解决此问题,保存对象后,在从方法返回之前获取它的ID,保留ID以便稍后查找该对象。

答案 1 :(得分:0)

在GAE事务中,事务中的所有查询都会在事务开始时看到数据存储状态的快照。查询不会返回在事务中修改过的任何新的或更新的实体,您必须自己跟踪它。

您应该返回交易查询的文档以获取更多详细信息。