我有域对象,如下所示:
@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"/>
答案 0 :(得分:0)
持久化具有标记为:
的id变量的对象时@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
我目前还不能100%确定使用提供的ID保存对象。但我认为它将使用完全不同的ID值保存对象,因为它跟随valueStrategy
。
要解决此问题,保存对象后,在从方法返回之前获取它的ID,保留ID以便稍后查找该对象。
答案 1 :(得分:0)
在GAE事务中,事务中的所有查询都会在事务开始时看到数据存储状态的快照。查询不会返回在事务中修改过的任何新的或更新的实体,您必须自己跟踪它。
您应该返回交易查询的文档以获取更多详细信息。