0

我有看起来像这样的域对象:

@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 而不是之前在几行代码中持久化的对象。这里有什么问题?这是一个一致性问题吗?该应用程序正在使用 High Replication Datastore

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

2 回答 2

0

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

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

于 2013-03-21T18:37:10.507 回答
0

当持久化带有 id 变量的对象时:

@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)

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

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

于 2013-03-21T00:45:59.153 回答